也写分析:为什么新浪视频会被Chrome误报,附解决办法

这事越来越不消停了。
简单说怎么解决:
设置——高级设置(最下面)——启用针对网上诱骗和恶意软件的防护功能 关闭。
 
然后是分析。。。
 
这个是sina躺枪吧。。。
之前为了抓B站视频写下载器简单看了一下这个CDN边缘是怎么来回跳的。
sina应该(99.99%)用了网宿(ChinaNet)的CDN。他们的CDN节点遍布全球,相当适合sina视频这种网站,而且技术积累也相当不错。
举一个实例:
无论是谁(A/B/sina自己)解析视频真实地址(vid->URL)。得到了这个地址,估计是网宿CDN的边缘地址:
http://edge.v.iask.com/123557717.hlv?KID=sina,viask&Expires=1389283200&ssig=uoYS0MDSlU
然后发送GET,收到一个302,转到:
http://edge.v.iask.com.lxdns.com/123557717.hlv?KID=sina,viask&Expires=1389283200&ssig=uoYS0MDSlU&corp=2
(lxdns.com ,名字用了龙讯,其实就是网宿旗下的。进入系统,等待分配最优主机)
继续GET,又是一个302:
http://120.39.183.37/edge.v.iask.com/123557717.hlv?KID=sina,viask&Expires=1389283200&ssig=uoYS0MDSlU&corp=2&wshc_tag=0&wsiphost=ipdbm
(这是最后的地址了,东西就在这台服务器上。)
估计是,由于获取内容并不通过域名检验来源,而且为了省钱,网宿并没有使用大量IP地址,不会像Cloudflare或Google一口气就包整个C段啥的。
但是,由于CDN并不关心传输了是什么东西(业务上会分,服务器有优化,但是并不关心具体内容),这个IP在复用的时候,被某钓鱼网站摊上了。这个钓鱼网站不是别人,是一个所谓的“宝软网”。查看DNS记录后,估计是个人都会觉得,这是Sina的小号吧。而且这个IP也为新浪爱问服务,于是,里面的恶意软件让这个IP中招了。
在举报后,Google直接将所有到这个IP的连接都扔进了黑名单。但是CDN在分配节点的时候不知道,于是所有在上面来回跳转后遇到黑名单IP的人都躺枪了。。。
解决办法:
1)网宿预先审查将分发的内容,将钓鱼站清理出去,同时找Google说明情况。肯定治本。
但是我不喜欢审查。。。作为基础服务提供商,我认为其审查网络内容是很不明智的,同时也是对互联网信息自由流动的侵犯。
或者
2)网宿向Google报上自己所有的IP段,要求白名单处理。听起来很奇怪,但是既然Cloudflare没听说过这种现象,那么肯定是有过什么协商。Cloudflare上面的钓鱼站更多,但是没听说他们的IP被黑名单。
也能一劳永逸,毕竟作为中国最大的CDN,网宿是可以与国际顶级CDN,例如Akamai,Amazon Cloudfront等齐名的大公司。
至于普通用户:
顺手点一下“举报误判”,人多了,Google自然会发现不对劲的。
无辜躺枪的A/B站:
A站。。。不评论
B站。。。不是有自己的CDN么?用自己的CDN顶上吧。

申请StartSSL的证书,在Nginx上启用,以及Firefox问题处理

StartSSL的免费证书乃神器。签一下,立即正规多了。虽然一些小地方不支持,但是也无伤大雅。
 
教程很多很多,简单说:
 
1.注册(别以为不真实的信息能混过去,没人会拿证书开玩笑的),安装浏览器的证书。这个要备份好,因为不可能恢复。
 
创建个私钥。
 
2.创建请求。
 
OpenSSL必须要有,如果你用LNMP,这个是已经有的。
 

openssl req -new -newkey rsa:2048 -nodes -out ssl.csr -keyout ssl.key

 
 
创建请求。信息要和注册时一样。
 

cat ssl.csr

 
 
这个就是请求了。
 
3.绑定域名。
 
有人说需要取消一下Whois保护,其实应该不用。大部分的保护都会转发你的邮件(例如Namecheap的WhoisGuard),这个只需要接一个验证码而已。
 
4.取证书。Copy出来。
 
5.准备证书。
 
这里有个重要提示,如果不这么做,Firefox会报错,很多需要curl的软件不能用。
 
网上教的办法对,但是有点毛病。
 
这么做:
 

openssl rsa -in ssl.key -out ssl2.key

 
 
这步解密Key,免得来回输密码。
 
避免偷窥:
 

chmod 600 ssl2.key

 
 
拽StartSSL的根证书和Class1证书:
 

wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem

 
 
合并:

cat ssl2.crt sub.class1.server.ca.pem ca.pem > ssl3.crt

 
 
无论你用什么软件,打开看一眼。今天在这个地方浪费了几个小时。
 
这个文件的格式必须是:
-----BEGIN CERTIFICATE-----
***
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
***
-----END CERTIFICATE——
-----BEGIN CERTIFICATE-----
***
-----END CERTIFICATE——
 
[warning]-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----中间必须空行!否则会直接报错![/warning]
 
6.去Nginx的conf修改。
 
估计大家都是LNMP,改域名的就行。
 
加上:

		listen 443;
		ssl on;
		ssl_certificate /***.crt;
		ssl_certificate_key /***.key;
		include wordpress.conf;
		location ~ .*\.(php|php5)?$
			{
				try_files $uri =404;
				fastcgi_pass  unix:/tmp/php-cgi.sock;
				fastcgi_index index.php;
				include fcgi.conf;
				fastcgi_param  HTTPS on;
			}

 
 
位置可以随便,放在web目录外吧。这样不被getshell就基本不怕。
 
你的东西现在应该畅通无阻了。

修理不听话的Yunio,外加评论插件

      No Comments on 修理不听话的Yunio,外加评论插件

老机器,还是熟悉的系统,还是熟悉的速度。
准备入手个KVM看看,LET询价中。。。
 
Yunio在Centos下各种不听话。思考再三,重装一下。
 
遇到个奇葩事情:
 
Yunio CentOS 32x 3.0.7 无法启动。
 
先说安装:需要个库 libnautilus-extension.so.1   。
 
安装:yum install nautilus-open-terminal
 
解决。
 
Yunio不听话的办法:
 
敲一句  export LC_ALL=“en_US.UTF-8"  然后命令行敲yunio。
 
最近评论启用了新插件,希望能挡住一些垃圾评论。被误杀的请邮件吧。。。

黑科技:直接挪用B站弹幕池+吐槽

      No Comments on 黑科技:直接挪用B站弹幕池+吐槽

简单的弹幕播放器,不再受制于人。
同B站共享弹幕,还可以发送。怎一个爽字了得。
需要有直链,这样最好。会难得倒你吗?
装个swf插件。
[kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://网站/wp-content/MukioPlayerPlus.swf?file=这里是文件直链,如果里面有符号,弄个短网址就成&cid=视频反查cid的办法之前N篇blog都有了,自己看去&type=video&sort=new&state=normal&autostart=false" width="600" height="600" targetclass="flashmovie" quality="high" scale="noscale" allowfullscreen="true"]
Get Adobe Flash player
[/kml_flashembed]
舒服了吧。
最近在高速迭代。
https://github.com/superwbd/Mukioplayer-Py-Mac
https://github.com/superwbd/ABPlayerHTML5-Py--nix
基本要的都实现了。还有什么需要的呢?GUI?

Biligrab 0.2: OSX与Linux下自动抓B站视频和弹幕的东西

新版:http://www.cnbeining.com/?p=410  增加了海外源功能。
 
差不多是最终版了。
自己抓,自己建立文件夹,自己改名,自己下载,自己合并,自己清理,自己弄弹幕。
国内外都友好。(联通你个缺大德的东西,没有你我根本不用写这么多,尼玛死。。。)
API化,不怕封锁。
源地址获取双保险,cid获取双保险。再不行的话,我也没辙了。
需要aria2c,ffmpeg。
我在OSX上写的,并测试成功。Linux也能用。Windows嘛,请用AcDown,然后自己合并合并。
 
已知问题:
极其极端情况下,下载失败。我也不知道为什么了。。。应该是sina的CDN问题吧。

'''
Biligrab 0.2
Beining@ACICFG
cnbeining[at]gmail.com
MIT licence
'''
import sys
import os
from StringIO import StringIO
import gzip
import urllib2
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def main(vid, p):
    cid = 0
    title = ''
    partname = ''
    biliurl = 'http://api.bilibili.tv/view?type=xml&appkey=876fe0ebd0e67a0f&id=' + str(vid) + '&page=' + str(p)
    videourl = 'http://www.bilibili.tv/video/av'+vid+'/index_'+p+'.html'
    print('Fetching webpage...')
    request = urllib2.Request(biliurl)
    response = urllib2.urlopen(request)
    data = response.read()
    data_list = data.split('\n')
    for lines in data_list:
        if 'cid' in lines:
            cid = lines[7:-6]
            print('cid is ' + str(cid))
        if 'partname' in lines:
            partname = lines[12:-11]
            print('partname is ' + str(partname))
        if 'title' in lines:
            title = lines[9:-8]
            print('title is ' + str(title))
    if cid is 0:
        print('Cannot find cid, trying to do it brutely...')
        print('Fetching webpage...')
        request = urllib2.Request(videourl)
        request.add_header('Accept-encoding', 'gzip')
        response = urllib2.urlopen(request)
        if response.info().get('Content-Encoding') == 'gzip':
            buf = StringIO( response.read())
            f = gzip.GzipFile(fileobj=buf)
            data = f.read()
        data_list = data.split('\n')
        #Todo: read title
        for lines in data_list:
            if 'cid=' in lines:
                cid = lines.split('&')
                cid = cid[0].split('=')
                cid = cid[-1]
                print('cid is ' + str(cid))
                break
    if cid is 0:
        print('Cannot get cid anyway, you fix it, I am off to get some coffee...')
        exit()
    #start to make folders...
    if title is not '':
        folder = title
    else:
        folder = cid
    if partname is not '':
        filename = partname
    elif title is not '':
        filename = title
    else:
        filename = cid
    folder_to_make = os.getcwd() + '/' + folder
    if not os.path.exists(folder_to_make):
        os.makedirs(folder_to_make)
    os.chdir(folder_to_make)
    print('Fetching XML...')
    os.system('curl -o "'+filename+'.xml" --compressed  http://comment.bilibili.tv/'+cid+'.xml')
    #os.system('gzip -d '+cid+'.xml.gz')
    print('The XML file, ' + filename + '.xml should be ready...enjoy!')
    print('Finding video location...')
    #try api
    request = urllib2.Request('http://interface.bilibili.tv/playurl?cid='+cid, headers={ 'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache' })
    response = urllib2.urlopen(request)
    data = response.read()
    data_list = data.split('\r')
    #print(data_list)
    rawurl = []
    vid_num = 0
    for lines in data_list:
        lines = str(lines)
        if '<url>' in lines:
            if 'youku' in lines:
                url = lines[17:-9]
            elif 'sina' in lines:
                url = lines[16:-9]
            rawurl.append(url)
        if 'backup_url' in lines:
            break
    if rawurl is []:  #hope this never happen
        request = urllib2.Request('http://www.flvcd.com/parse.php?kw='+videourl)
        request.add_header('Accept-encoding', 'gzip')
        response = urllib2.urlopen(request)
        data = response.read()
        data_list = data.split('\n')
        for items in data_list:
            if 'name' in items and 'inf' in items and 'input' in items:
                c = items
                rawurl = c[39:-5]
                rawurl = rawurl.split('|')
                break
    #print(rawurl)
    vid_num = len(rawurl)
    #print(rawurl)
    print(str(vid_num) + ' videos to download, fetch yourself a cup of coffee...')
    for i in range(vid_num):
        print('Downloading ' + str(i+1) + ' of ' + str(vid_num) + ' videos...')
        #print('aria2c -llog.txt -c -s16 -x16 -k1M --out '+str(i)+'.flv "'+rawurl[i]+'"')
        os.system('aria2c -larialog.txt -c -s16 -x16 -k1M --out '+str(i)+'.flv "'+rawurl[i]+'"')
    f = open('ff.txt', 'w')
    ff = ''
    os.getcwd()
    for i in range(vid_num):
        ff = ff + 'file \'' + str(os.getcwd()) + '/'+ str(i) + '.flv\'\n'
    ff = ff.encode("utf8")
    f.write(ff)
    f.close()
    print('Concating videos...')
    os.system('ffmpeg -f concat -i ff.txt -c copy "'+filename+'".mp4')
    os.system('rm -r ff.txt')
    for i in range(vid_num):
        os.system('rm -r '+str(i)+'.flv')
    print('Done, enjoy yourself!')
    exit()
vid = str(input('av'))
p = str(input('P'))
main(vid, p)

 

如何使用PGP加密邮件等信息

      No Comments on 如何使用PGP加密邮件等信息

http://www.gnupg.org/
 
邮件服务端,建议ThunderBird。
 
理论上,一切的往来都应该加密。
 
Gmail,建议使用开发版的webpg。https://github.com/kylehuff/webpg-chrome/wiki#install-development-build
它可以直接调用本地的加密,速度快,而且安全。
如果对加密要求更高,请停用自动保存草稿。
 
国内邮箱,Mailvelope可以在网页内加密,唯一的遗憾是不能签名。
 
 
 

本人与ACI字幕组开始提供实验性加密邮件服务

我们推荐大家多多使用加密。
这可以保证你的邮件不会被第三方偷窥,即使被截获。
 
例如,您想向ACI字幕组匿名提供资料,但又怕被其他人发现的时候,您可以使用这种方式。
请注意:由于附件直接加密后附件会变成邮件正文,造成下一步难以处理(浏览器开一个10M的文件?当场死给你看),请先PGP加密文件后,再通过邮箱发送,谢谢。
 
ACI字幕组cdc[at]chineseaci.com 的PGP公钥:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG/MacGPG2 v2.0.22 (Darwin)
Comment: GPGTools - https://gpgtools.org
mQENBFKlnhcBCACWgBL4x+78aqf6Y9jGNqVbcz9g7jlJoqOrtIEY88IXO6rjV4Nn
Mt8Getub0Q0i8fc4rSa/guAtC8G0Bl68ml1HeCFD9xW3PMyCeEehzfMh28FM0xOZ
v3l9tOvplA8nRkS0oBoR0k+q9HAj0dOgtsFg03rPXAP1/eK/RncFCmDNDY4L266R
tCZjsNIgCaV6bZRFrXY/VI0lzCU0Wdqx8rwzIjb3R3P/+vmRGpfifPpu3jKNrGg7
h/qWZCq/OAkaXSliE8YbfI3fxL4spGUqpLlP0LpD+dKQWB240DmT+tFLBdpPwo4p
0DXVXriyTvUxa/dd4xeAOgzu4yag2LJQ//R/ABEBAAG0MkFDSUNGRy1DREMgKEFD
SUNGRyBUZWNoIFRlYW0pIDxjZGNAY2hpbmVzZWFjaS5jb20+iQE9BBMBCgAnBQJS
pZ4XAhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEIciYTA9YMfk
eCQH/3E3NkKr7wXwDq2sppHxn/mwHY4lN58BpnNeTE+D31w7I2hg4bRMt11P3zB+
AnJqZ9XXh77rlUFdnkyQI+TNqgGayXjgyipFeIyoNy6YGADOIlSazF2tJWe5wzRT
aSLo2Q9hVrFop+G6EXJGqO2EWyAo+Zd4C8xB9W2iUGVFqv41jlg52P+qP9Zly+lm
x1EMlgHMUXpvun64NQ6rNS0ulxF/TR2eTmRLKI9TYPwf+d1snRGSmr8in9SSMGEB
qckGhvh/kZub9gQdKlKfCX/6o/F5H1AukkN0fJq6pY4rR+mNtm5hL/DVnnVp/eMR
vW10hJuPBBOYK6pY0y0VxKJbCay5AQ0EUqWeFwEIANrFjLEXWcAnAZaAW6md9DY5
HbbkR7mgFDNdsulGBwFNLjgkfGY3cc5K8B38A3BYgRHGuzNHkphCb3w825tBpQ6n
Yqy8IXoLcoC0+EFwfwkJdS2wsWUhvY5ejwhilZ7NTN1eAsvV/0JMzTimoy3QmssI
OhnPs3bo1VPs8MZXBy/gV/kYT9M/MZoB1M60ECYrivIi9Da66MhBa0e6gsTmRryH
ZFLG4XtIAoFGL8GZ0FLT4eJwT5a4dZolEM29z0MN2aGpOznIRGRN5B4pPnL8f3kj
pWsCWIm+OicKudBULZL0gCK3sh/aTQfGob3DyfZ9CtbrraOu/R0SJygB62y8kVUA
EQEAAYkBJQQYAQoADwUCUqWeFwIbDAUJB4YfgAAKCRCHImEwPWDH5Cm7B/9AUJ2h
2e1skoGlEURnDmb4M+rhSIeKj8FiCbI2bHln1//G5GNwztp7V/VAx+URA5z+YJxD
qCcbOIVEkwz8wGE+EY/gHhSkRDHTyaWNek0DCSjo2FGx1xktVFNE+V0khOMdA/NF
f8G8IBZTGp9yFQGZu6/mhXN3ix4qpFWxoIteDEpnutZdPFgYM2LbwvBSGV07CPI0
SfszzLe3ZNqweWcDv4ZW1Zi8rc0fRM4wBOGVorxiV4Pj+lSnwkqRE3G5s82oPixo
y3LsI/vTewjoUFwgoh6ap5WDohxOAujnLcAoPuau40VjyEKB3mO9JGefToUDwJ98
gf16ScSwPavatUMV
=wohi
-----END PGP PUBLIC KEY BLOCK-----

您可以使用它加密信件、文件等一切信息。
我们保证,内部只有拥有CDC邮箱查阅权的人员才能解密。
我的个人邮箱的加密公钥:
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG/MacGPG2 v2.0.22 (Darwin)
Comment: GPGTools - https://gpgtools.org
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
=Pg4N
-----END PGP PUBLIC KEY BLOCK-----
 

Mac下下载B站弹幕,视频,拼装的东西

更新版本:http://www.cnbeining.com/?p=330
 
爱咋咋地了,擦。
难看就难看吧。
等下整个函数化后,把其他站加上。
 
用途:
下载弹幕
下载视频
拼成一个文件
 
 
Todo:
其他站支持
函数化
加个判断视频名的功能,新建目录扔进去

import os
from StringIO import StringIO
import gzip
import urllib2
def main(vid, p):
    cid = 0
    biliurl = 'http://www.bilibili.tv/video/av'+vid+'/index_'+p+'.html'
    print('Fetching webpage...')
    request = urllib2.Request(biliurl)
    request.add_header('Accept-encoding', 'gzip')
    response = urllib2.urlopen(request)
    if response.info().get('Content-Encoding') == 'gzip':
        buf = StringIO( response.read())
        f = gzip.GzipFile(fileobj=buf)
        data = f.read()
    data_list = data.split('\n')
    for lines in data_list:
        if 'cid=' in lines:
            cid = lines.split('&')
            cid = cid[0].split('=')
            cid = cid[-1]
            print('cid is ' + cid)
            break
    if cid is 0:
        print('Cannot find cid!')
        exit()
    print('Fetching XML...')
    os.system('curl -o '+cid+'.xml --compressed  http://comment.bilibili.tv/'+str(cid)+'.xml')
    #os.system('gzip -d '+cid+'.xml.gz')
    print('The XML file, ' + cid + '.xml should be ready...enjoy!')
    print('Finding video location...')
    request = urllib2.Request('http://www.flvcd.com/parse.php?kw='+biliurl)
    request.add_header('Accept-encoding', 'gzip')
    response = urllib2.urlopen(request)
    data = response.read()
    data_list = data.split('\n')
    for items in data_list:
        if 'name' in items and 'inf' in items and 'input' in items:
            c = items
            rawurl = c[39:-5]
            rawurl = rawurl.split('|')
            vid_num = len(rawurl)
            break
    print(rawurl)
    print(vid_num)
    for i in range(vid_num):
        print(i)
        os.system('aria2c -c -s16 -x16 -k1M --out '+str(i)+'.flv '+rawurl[i])
    f = open('ff.txt', 'w')
    ff = ''
    os.getcwd()
    for i in range(vid_num):
        ff = ff + 'file \'' + str(os.getcwd()) + '/'+ str(i) + '.flv\'\n'
    ff = ff.encode("utf8")
    f.write(ff)
    f.close()
    os.system('ffmpeg -f concat -i ff.txt -c copy '+str(cid)+'.mp4')
    os.system('rm -r ff.txt')
    exit()
vid = str(input('av'))
p = str(input('P'))
main(vid, p)