虽然我不用他的垃圾直播。
试试两个传图片的API,还有百度OCR的API。
求测试后反馈,无论是不是好用。
https://github.com/cnbeining/bilibili-grab-sliver
#!/usr/bin/env python
#coding:utf-8
# Author: Beining --<i#cnbeining.com>
# Purpose: Auto grab silver of Bilibili
# Created: 10/22/2015
# https://www.cnbeining.com/
# https://github.com/cnbeining
import sys
import os
import requests
import json
from base64 import b64encode
import shutil
import getopt
from json import loads
import datetime
import time
import base64,hmac,hashlib
import re
#----------------------------------------------------------------------
def generate_16_integer():
"""None->str"""
from random import randint
return str(randint(1000000000000000, 9999999999999999))
#----------------------------------------------------------------------
def safe_to_eval(string_this):
""""""
pattern = re.compile(r'^[\d\+\-\s]+$')
match = pattern.match(string_this)
if match:
return True
else:
return False
#----------------------------------------------------------------------
def get_new_task_time_and_award(headers):
"""dict->tuple of int
time_in_minutes, silver"""
random_r = generate_16_integer()
url = 'http://live.bilibili.com/FreeSilver/getCurrentTask?r=0.{random_r}'.format(random_r = random_r)
response = requests.get(url, headers=headers)
a = loads(response.content)
if a['code'] == 0:
return (a['data']['minute'], a['data']['silver'])
#----------------------------------------------------------------------
def get_captcha_from_live(headers, uploader = 'i'):
"""dict,str->str
get the captcha link"""
import shutil
random_t = generate_16_integer() #save for later
url = 'http://live.bilibili.com/FreeSilver/getCaptcha?t=0.{random_t}'.format(random_t = random_t)
response = requests.get(url, stream=True, headers=headers)
if uploader == 't': #tietuku
result = uploadImageToTietuku(response.raw)
elif uploader == 'i': #imgur
result = image_to_imgur_link(response.raw)
return result
#----------------------------------------------------------------------
def uploadImageToTietuku(file):
"""rawfile->str
http://www.01responsible.com/2015/05/%E8%B4%B4%E5%9B%BE%E5%BA%93python%E4%B8%8A%E4%BC%A0%E4%BB%A3%E7%A0%81/"""
URL = "http://up.tietuku.com/"
jsoncode = ('{\"deadline\":%s,\"aid\":%s}') % (int(time.time())+60,1145722)
encodedParam = base64.urlsafe_b64encode(jsoncode)
sign = hmac.new("da39a3ee5e6b4b0d3255bfef95601890afd80709",encodedParam,hashlib.sha1).digest()
encodedSign = base64.urlsafe_b64encode(sign)
Token = "98bf82eb7ddcb735e77d7e6c71b723c83265e560" + ':' + encodedSign + ':' + encodedParam
a = requests.post(URL, {"Token":Token},files={"file":file})
return str(json.loads(a.content)['linkurl'])
#----------------------------------------------------------------------
def image_to_imgur_link(file_this):
"""rawfile->str"""
import requests
import json
from base64 import b64encode
url = 'https://api.imgur.com/3/image.json'
headers = {"Authorization": "Client-ID 4c5addf77336c2d"}
j1 = requests.post(
url,
headers = headers,
data = {
'image': b64encode(file_this.read()),
'type': 'base64',
}
)
info = json.loads(j1.text.decode('utf-8'))
#status_this = str(info['status'])
#print(info)
link_this = str(info['data']['link'])
return link_this
#----------------------------------------------------------------------
def image_link_ocr(image_link):
""""""
from baiduocr import BaiduOcr
API_KEY = 'c1ff362dc90585fed08e80460496eabd'
client = BaiduOcr(API_KEY, 'test') # 使用个人免费版 API,企业版替换为 'online'
res = client.recog(image_link, service='Recognize', lang='CHN_ENG')
return res['retData'][0]['word']
#----------------------------------------------------------------------
def send_heartbeat(headers):
""""""
random_t = generate_16_integer()
url = 'http://live.bilibili.com/freeSilver/heart?r=0.{random_t}'.format(random_t = random_t)
#print(url)
response = requests.get(url, headers=headers)
a = loads(response.content)
if response.status_code != 200 or a['code'] != 0:
print('WARNING: S**t happened!')
print(a['msg'])
else:
return True
#----------------------------------------------------------------------
def get_award(headers, captcha):
"""dict, str->int/str"""
random_t = generate_16_integer()
url = 'http://live.bilibili.com/freeSilver/getAward?r=0.{random_t}&captcha={captcha}'.format(random_t = random_t, captcha = captcha)
response = requests.get(url, headers=headers)
a = loads(response.content)
if response.status_code != 200 or a['code'] != 0:
print('WARNING: SHTF!')
print(a['msg'])
return False
else:
return int(a['data']['awardSilver'])
#----------------------------------------------------------------------
def read_cookie(cookiepath):
"""str->list
Original target: set the cookie
Target now: Set the global header"""
print(cookiepath)
try:
cookies_file = open(cookiepath, 'r')
cookies = cookies_file.readlines()
cookies_file.close()
# print(cookies)
return cookies
except Exception:
print('Cannot read cookie, may affect some videos...')
return ['']
#----------------------------------------------------------------------
def captcha_wrapper(headers, uploader):
""""""
captcha_link = get_captcha_from_live(headers, uploader)
captcha_text = image_link_ocr(captcha_link).encode('utf-8')
answer = ''
if safe_to_eval(captcha_text):
try:
answer = eval(captcha_text) #+ -
except NameError:
answer = ''
if answer == '': #error or cannot be eval
print('WARNING: Cannot automatic the process due to security concerns')
print('OCR result: {captcha_text}'.format(captcha_text = captcha_text))
answer = raw_input('please type the result by yourself: ')
return answer
#----------------------------------------------------------------------
def usage():
""""""
print("""Auto-grab
-h: help:
This.
-c: cookies:
location of cookies
-u: Uploader:
t: Tietuku
i: Imgur
""")
#----------------------------------------------------------------------
def main(headers = {}, uploader='i'):
""""""
time_in_minutes, silver = get_new_task_time_and_award(headers)
print('ETA: {time_in_minutes} minutes, silver: {silver}'.format(time_in_minutes = time_in_minutes, silver = silver))
now = datetime.datetime.now()
picktime = now + datetime.timedelta(minutes = time_in_minutes)
while 1:
if datetime.datetime.now() <= picktime:
send_heartbeat(headers)
time.sleep(30)
else:
break
answer = captcha_wrapper(headers, uploader)
award = get_award(headers, answer)
if award == -400 or award == -99: #incorrect captcha/not good to collect
for i in range(10):
captcha_wrapper(headers, uploader)
award = get_award(headers, answer)
if award == True:
break
else:
time.sleep(5)
print('Award: {award}'.format(award = award))
return award
if __name__=='__main__':
argv_list = []
argv_list = sys.argv[1:]
cookiepath,uploader = '', ''
try:
opts, args = getopt.getopt(argv_list, "hc:u:",
['help', "cookie=", "uploader="])
except getopt.GetoptError:
usage()
exit()
for o, a in opts:
if o in ('-h', '--help'):
usage()
exit()
if o in ('-c', '--cookie'):
cookiepath = a
print('aasd')
if o in ('-u', '--uploader'):
uploader = a
if cookiepath == '':
cookiepath = './bilicookies'
if uploader == '':
uploader = 'i'
cookies = read_cookie(cookiepath)[0]
headers = {
'dnt': '1',
'accept-encoding': 'gzip, deflate, sdch',
'accept-language': 'en-CA,en;q=0.8,en-US;q=0.6,zh-CN;q=0.4,zh;q=0.2',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.16 Safari/537.36',
'accept': 'image/webp,image/*,*/*;q=0.8',
'authority': 'live.bilibili.com',
'cookie': cookies,
}
while 1:
main(headers, uploader)
次次都不知道使用方法 QwQ
上Github看最新版,严格按照requirement安装环境,务必。
一群人找我问我要疯要疯。
可用的,效率挺高,基本一个小时可以领完一个号,可以多线程、
不过这个自动读取cookie的一直没搞会,后来我干脆直接在代码前面把cookie定义了
感谢Beining
:3
不同的号可以一起弄,但是单个号只能等,而且只能等那么长时间:这个时间是服务器提供,我们没办法。
自动读cookie 参见Biligrab。
对于类似项目的实现,我的态度是,不建议使用非正规手段(e.g.,使用漏洞等方式,而不是正常登陆)获取cookie,并保证完整cookie不离开本机被集中或分布存储,以免造成严重安全后果。这个问题输不起。
现在安卓客户端也有领瓜子的功能了,领取没有验证码,次数比网页多两次
大大能不能再写哥安卓领取瓜子的功能
这几天有点忙,等我有时间抓包看看。
没验证码真是好事情。
写了。
最新的这版我在vps上运行提示
File “autograb.py”, line 172
^
IndentationError: unexpected unindent
上一版用的时候会出现验证码错误
啊 删代码太爽 删大发了。
试试最新commit呗。
还是有毒啊
Python2.7.6和Python3.4.3都是这个提示
Traceback (most recent call last):
File “autograb.py”, line 152, in
logging.basicConfig(level = logging_level_reader(LOG_LEVEL))
NameError: name ‘logging_level_reader’ is not defined
再看看。。。。。。
Traceback (most recent call last):
File “autograb.py”, line 164, in
main(headers)
File “autograb.py”, line 107, in main
time_in_minutes, silver = get_new_task_time_and_award(headers)
File “autograb.py”, line 35, in get_new_task_time_and_award
url = ‘http://live.bilibili.com/mobile/freeSilverCurrentTask?appkey={APPKEY}&platform=ios&sign={sign}’.format(APPKEY = APPKEY, sign = calc_sign(str2Hash))
NameError: name ‘calc_sign’ is not defined
难道你本地运行的时候没有出错吗
我没运行。。。。。。
蛋疼,触发垃圾评论机制了
最新的这版能运行,但是会卡在等待3分钟那里,然后
ETA: 3 minutes, silver: 30
Traceback (most recent call last):
File “autograb.py”, line 171, in
main(headers)
File “autograb.py”, line 124, in main
award = get_award(headers)
File “autograb.py”, line 68, in get_award
freeSilverAward
NameError: global name ‘freeSilverAward’ is not defined
好吧我有时间修修(
咨询一下关于客户端sign的算法是如何取出来的
反编译了ios客户端?
公开API文档。
话说iOS怎么反编译?
硬盘挂了以至于没能及时回复。
不能反编译,所以我才以为是有了什么手段解出来的。
据悉是可以动态调试,但也不清楚太具体的……
十分感谢。
节哀顺变。。。
APK可以反编译。
但是我并不需要他的APPKEY:我当时留了个。
但是第三方登陆就彻底傻逼了。。。没办法了。
我有一小撮内部key,但是拿出来没啥意思。取得的手段包括拆播放器,灭APK,翻Google,Github Hack,以及。。。一点自己的小办法。但是没意思:用Biligrab的得了,我不care。
iOS应该是不能反编译吧。。。真的。
beining想问一下这个是怎么用的,PY已经下载好了
死了。