周末送娃踢球,我躲在车里做了一件有意思的事。
用我的三脚猫python和懵逼的web开经验,做了一个每天自动发送今日头条微头条的小公举。
下面就分享给大家现个丑。
当然先从登录开始,我仅做了一个cookie的登录,打开今日头条登录后,F12-------network
找到user_login_status_api
划横线的就是登陆的api,注意请求方式是GET

python 头条号自动发文 今日头条自动发布文章_python 头条号自动发文


记录cookie
referer和user-agent

python 头条号自动发文 今日头条自动发布文章_python_02


ok! 有了这些,我们就能写程序完成登录部分了。

import requests
login_api = 'https://mp.toutiao.com/mp/agw/media/user_login_status_api'
headers = {
        'user-agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
        'referer' : 'https://mp.toutiao.com/profile_v4/index',
        'cookie' : 'passport_csrf_token_default=6ef1ede362c07dfc9883xxx'
    }

def login():
    print(requests.get(login_api, headers=headers).json())

运行看下:

{'code': 0, 'data': {'is_login': True, 'media': {'avatar_info_ok': True, 'can_renew_account': False, 'is_media': True, 'media_info_ok': True, 'media_status_ok': True, 'verified_info_ok': True}, 'user': {'is_virtual_mobile': False, 'mobile_bind_ok': True, 'user_status_ok': True}}, 'message': 'success'}

没啥问题成功了。
接下来就是看下发微头条的api和相关参数,继续F12看network

python 头条号自动发文 今日头条自动发布文章_大数据_03


随便打点字

python 头条号自动发文 今日头条自动发布文章_post_04


可以提前清一下日志
然后发布。

python 头条号自动发文 今日头条自动发布文章_大数据_05


我们找到了发布的api,记录下来
消息类型是POST
然后我们注意到他有个参数叫_signature
这么老长的玩意可差点让我失去信心
还好经过百度谷歌一圈,看到网上有解决方案
具体过程就不贴了,本来也是拿来主义,有兴趣的朋友可以自行搜索大神们的文章。
这里贴一下代码实现,稍有调整,因为python调用js的库大神文章中用的我没调试成功,就找了一个替代库。

import js2py

好,有了签名,我们再看看其他参数

python 头条号自动发文 今日头条自动发布文章_chrome_06


很简单,原来就是个payload
那么马上动起来:

push_api = 'https://mp.toutiao.com/mp/agw/article/wtt?_signature={}'
data = {
    'content': '午睡也是很重要的哦!',
    'image_list': [],
    'is_fans_article': 2,
    'pre_upload': 1,
    'star_order_id': ''
}
def publish(_signature):
    requests.post(push_api.format(_signature, headers=headers, data=json.dumps(data)))

运行调试,成功!

眼尖的小伙伴肯定发现了image_list这个参数
这不就是发送图片吗,我们发文章没有图怎么行,这就安排!
我们再按流程操作,上传一张图片

python 头条号自动发文 今日头条自动发布文章_post_07


python 头条号自动发文 今日头条自动发布文章_chrome_08


上传之后我们观察请求,发现这个api很像,于是我们赶紧分析一下!

python 头条号自动发文 今日头条自动发布文章_post_09


同样这是api,请求是POST类型
我们看看表单参数

python 头条号自动发文 今日头条自动发布文章_post_10


就是个二进制,那一看就是图片
为了文章连贯性,我就不卖关子了,之前踩的坑就不给大家说了,直接继续说。
我们打开返回标签页

python 头条号自动发文 今日头条自动发布文章_chrome_11


我们看看返回数据:

{"code":0,"height":504,"image_type":1,"message":"success","mime_type":"image/jpeg","origin_web_uri":"tos-cn-i-3003/7990de594af9435c9c3e7859849edf76","origin_web_url":"https://image-tt-private.toutiao.com/tos-cn-i-3003/7990de594af9435c9c3e7859849edf76~tplv-obj.image?policy=eyJ2bSI6MywidWlkIjoiMTU1NjUyODczNjUwOTY5MyJ9\u0026traceid=202107261255010101511920350006499B\u0026x-orig-authkey=5a21e4afda5945d9a206a695e4c78a63\u0026x-orig-expires=2147483647\u0026x-orig-sign=ZTf4HJxEMgom6fKs10hRtAfUgQ8%3D","original":"tos-cn-i-3003/7990de594af9435c9c3e7859849edf76","state":"SUCCESS","title":"","url":"https://image-tt-private.toutiao.com/tos-cn-i-3003/7990de594af9435c9c3e7859849edf76~tplv-obj.image?policy=eyJ2bSI6MywidWlkIjoiMTU1NjUyODczNjUwOTY5MyJ9\u0026traceid=202107261255010101511920350006499B\u0026x-orig-authkey=5a21e4afda5945d9a206a695e4c78a63\u0026x-orig-expires=2147483647\u0026x-orig-sign=ZTf4HJxEMgom6fKs10hRtAfUgQ8%3D","web_uri":"tos-cn-i-3003/7990de594af9435c9c3e7859849edf76","web_url":"https://image-tt-private.toutiao.com/tos-cn-i-3003/7990de594af9435c9c3e7859849edf76~tplv-obj.image?policy=eyJ2bSI6MywidWlkIjoiMTU1NjUyODczNjUwOTY5MyJ9\u0026traceid=202107261255010101511920350006499B\u0026x-orig-authkey=5a21e4afda5945d9a206a695e4c78a63\u0026x-orig-expires=2147483647\u0026x-orig-sign=ZTf4HJxEMgom6fKs10hRtAfUgQ8%3D","width":504}

其中origin_web_uri这个值直接保留,后面上传会用到。

upload_api = 'https://mp.toutiao.com/mp/agw/article_material/photo/upload_picture?type=ueditor&pgc_watermark=0&action=uploadimage&encode=utf-8&is_private=1'
def upload(img):
    rep = requests.post(upload, headers=headers, files=img).json()
    return rep['origin_web_uri']

最后,我们再回到发布api
将图片的唯一id赋值给image_list
稍微修改下发布接口:

def publish(_signature, images):
    data['image_list'].append(images)
    requests.post(push_api.format(_signature, headers=headers, data=json.dumps(data)))

至此一条完整的微头条就发布成功了。
当然授人以鱼不如授人以渔,我是既授人以鱼还授人以渔。
我觉得这应该是相对简单的流程,而且运气比较好,能得到其他大神的帮助。
总结基本就是以下几步:
1.监控目标的请求,确定api
2.分析参数及参数的生成
3.分析返回结果及其使用场景
仅此希望这篇文章能打开你python世界的大门!
附录:
工具虽然完成了,但文章内容来源是个需要考虑的问题。
我是从一些免费api获取了一些生活小常识,健康小知识,小笑话这类的咨询。
然后从免费无版权的图片网站爬取图片发送。
目前阅读效果一般,我相信大家一定会有更好的更吸引人的内容。