原文链接
随便玩玩,要不要试试大吼一声来发条微博mp.weixin.qq.com
效果展示
见:https://zhuanlan.zhihu.com/p/...
导语
好多天没写推文了,出来冒个泡吧。听说很多小伙伴因为疫情在家快憋坏了,要不试试一起对着电脑吼两声发泄一下?吼的够大声就可以自动发条微博庆祝一下?废话不多说,让我们愉快地开始吧~
原理简介
既然要实现自动发微博,首先自然要实现微博模拟登录啦。这里我们还是借助公众号开源的模拟登录包DecryptLogin来实现:
'''利用DecryptLogin模拟登录'''
@staticmethod
def login(username, password):
lg = login.Login()
infos_return, session = lg.weibo(username, password, 'pc')
return infos_return.get('nick'), infos_return.get('uid'), session
接着我们来新建一个文件夹(例如weibo),在这个文件夹里放我们需要发的微博的内容:
weibo文件夹里的内容如下:
其中pictures文件夹里放我们微博的配图:
http://weixin.qq.com/r/Pi-y6qjEqPXXreyJ93os(二维码自动识别)
weibo.md里写我们微博的文字内容:
写个函数来自动解析一下上面的微博内容:
'''待发送微博内容解析'''
def __parseWeibo(self, weibopath):
text = open(os.path.join(weibopath, 'weibo.md'), 'r', encoding='utf-8').read()
pictures = []
for filename in sorted(os.listdir(os.path.join(weibopath, 'pictures'))):
if filename.split('.')[-1].lower() in ['jpg', 'png']:
pictures.append(open(os.path.join(weibopath, 'pictures', filename), 'rb').read())
if len(pictures) > 9:
print('[Warning]: 一条微博最多只能有9张配图, 程序现在将自动剔除多出的图片')
pictures = pictures[:9]
return text, pictures
该函数可以根据传入的微博文件夹路径(例如我们刚刚在当前目录新建了一个名为weibo的文件夹,那么我们可以传入./weibo)来自动解析待发送的微博内容(文字+配图)。
成功解析微博内容后,进入我们的重头戏,对着电脑大吼一声来自动发微博。原理说起来其实很简单,就是利用python的pyaudio包来检测当前电脑麦克风输入的声音音量,当音量足够大时(需要在30s内达到设定的最小音量),就自动把刚刚的微博发送出去:
# 大吼一声确定是该微博
print('微博内容为: %s\n配图数量为: %s' % (text, len(pictures)))
print('如果您确认想发这条微博, 请在30s内对着电脑大吼一声')
stream = pyaudio.PyAudio().open(format=pyaudio.paInt16,
channels=1,
rate=int(pyaudio.PyAudio().get_device_info_by_index(0)['defaultSampleRate']),
input=True,
frames_per_buffer=1024)
is_send_flag = False
start_t = time.time()
while True:
time.sleep(0.1)
audio_data = stream.read(1024)
k = max(struct.unpack('1024h', audio_data))
# --声音足够大, 发送这条微博
if k > 8000:
is_send_flag = True
break
# --时间到了还没有足够大的声音, 不发这条微博
if (time.time() - start_t) > 30:
break
# 发送微博
if is_send_flag:
print('大吼成功! 准备开始发送该条微博~')
if self.__sendWeibo(text, pictures):
print('[INFO]: 微博发送成功!')
有小伙伴可能会问了,咋自动发微博?和网上的教程一样去注册SDK么?当然,不是啦,注册SDK多麻烦(还经常通不过注册T_T)。直接试着发条微博抓个包不就行了么:
我们可以很容易发现,图片上传用的是这个接口:
发微博用的则是这个接口:
于是我们可以很轻松地写出自动发微博的函数来:
'''发微博'''
def __sendWeibo(self, text, pictures):
# 上传图片
pic_id = []
url = 'https://picupload.weibo.com/interface/pic_upload.php'
params = {
'data': '1',
'p': '1',
'url': 'weibo.com/u/%s' % self.uid,
'markpos': '1',
'logo': '1',
'nick': '@%s' % self.nickname,
'marks': '1',
'app': 'miniblog',
's': 'json',
'pri': 'null',
'file_source': '1'
}
for picture in pictures:
res = self.session.post(url, headers=self.headers, params=params, data=picture)
res_json = res.json()
if res_json['code'] == 'A00006':
pid = res_json['data']['pics']['pic_1']['pid']
pic_id.append(pid)
time.sleep(random.random()+0.5)
# 发微博
url = 'https://www.weibo.com/aj/mblog/add?ajwvr=6&__rnd=%d' % int(time.time() * 1000)
data = {
'title': '',
'location': 'v6_content_home',
'text': text,
'appkey': '',
'style_type': '1',
'pic_id': '|'.join(pic_id),
'tid': '',
'pdetail': '',
'mid': '',
'isReEdit': 'false',
'gif_ids': '',
'rank': '0',
'rankid': '',
'pub_source': 'page_2',
'topic_id': '',
'updata_img_num': str(len(pictures)),
'pub_type': 'dialog'
}
headers = self.headers.copy()
headers.update({'Referer': 'http://www.weibo.com/u/%s/home?wvr=5' % self.uid})
res = self.session.post(url, headers=headers, data=data)
is_success = False
if res.status_code == 200:
is_success = True
return is_success
OK,大功告成~完整源代码详见相关文件。