我的上一篇文章有讲到graia机器人配置的问题,这次用他和爬虫实现一个比较有趣的东西
群友在查看电脑端qq看点的分享视频时会出现这种情况无法查看,但也并不是完全没有办法获取到视频的链接
mcl中我们可以看到这样的东西,显然这是一个app消息,里面有一些链接
{
"app": "com.tencent.biz.pubaccount.readinjoy",
"view": "baseView",
"ver": "1.0.0.69",
"prompt": "[视频]两星武器+两星圣遗物优菈VS公子!!",
"meta": {
"data": {
"id": "none",
"rowkey": "57060ed7437393ah",
"uin": "1653490853",
"puin": "1001014387914",
"nick": "@{uin:1001014387914,nick:月枫Aurora}",
"contentJumpUrl": "https:\/\/web.kandian.qq.com\/tpl\/sharePage?kandianshare.html5.qq.com=1&_bid=4563&pgyid=2008&rowkey=57060ed7437393ah&enc_u=uDW52aqCa5WF6tHvmNsoKg==",
"avatar": "http:\/\/p.qpic.cn\/kd_face\/ajNVdqHZLLD2TyCdTfAB8ic2l5FswicLVVxrYMLH7Yp6k\/0",
"avatarJumpUrl": "https:\/\/kandian.qq.com\/mqq\/vue\/main?_wv=10145&_bid=3302&adfrom=qqshare&x5PreFetch=1&accountId=MTAwMTAxNDM4NzkxNA==",
"iconJumpUrl": "mqqapi:\/\/readinjoy\/open?src_type=internal&target=1&version=1",
"media": [
{
"isVideo": true,
"videoDuration": 483,
"width": 1920,
"height": 1080,
"url": "http:\/\/qqpublic.qpic.cn\/qq_public_cover\/0\/0-2453122286-F3BDFB3840A93FAFB76992C8D2C2F84E_vsmcut\/0?busiType=2"
}
],
"title": "两星武器+两星圣遗物优菈VS公子!!",
"type": 2,
"isAIO": 1,
"appName": "kandian"
}
}
}
在里面可以找到contentJumpUrl,https://web.kandian.qq.com/tpl/sharePage?kandianshare.html5.qq.com=1&_bid=4563&pgyid=2008&rowkey=57060ed7437393ah&enc_u=uDW52aqCa5WF6tHvmNsoKg==这个链接就是我们需要爬取的链接
接下来要寻找视频的直链
把上面的contentjumpurl输入到浏览器中f12查找可以发现视频的直链在这里
这个请求需要的参数在这里
{“user”:{“account”:{“account_type”:1,“user_id”:“0”,“req_recommend_flag”:0}},“device”:{“app_version”:“0”,“qua”:"",“os”:3,“device_id”:"",“terminal_id”:"",“app_type”:3,“guid”:"",“ip”:"",“network”:0},“share_rowkey”:“57060ed7437393ah”,“page”:{“tab_id”:"",“rowkeys”:[“57060ed7437393ah”],“load_more_count”:0,“refresh_count”:0,“load_type”:1},“cookie”:"",“ext”:{}}
我们要获取的是这个rowkeys和keyws(内容一样)
这个参数可以在之前的contentJumpUrl里找到
所以我们要做的就是用mcl获取卡片信息里的url里的rowkeys参数然后爬取视频直链
代码如下
# -*- coding: UTF-8 -*-
import json
from graia.broadcast import Broadcast, BaseEvent
from graia.application.entry import *
from graia.application.message.elements.internal import *
import requests
from graia.scheduler import timers
import graia.scheduler
from graia.application.event.mirai import FriendRecallEvent, GroupRecallEvent
accout=234654570
loop = asyncio.get_event_loop()
bcc = Broadcast(loop=loop)
sche = graia.scheduler.GraiaScheduler(loop=loop, broadcast=bcc)
app = GraiaMiraiApplication(
broadcast=bcc,
connect_info=Session(
host="http://localhost:10008", # 填入 httpapi 服务运行的地址
authKey="yszzsyszzs", # 填入 authKey
account=accout, # 你的机器人的 qq 号
websocket=True # Graia 已经可以根据所配置的消息接收的方式来保证消息接收部分的正常运作.
))
def qqkandian(key):
url = "https://cgi.kandian.qq.com/trpc.tkdqq.kd_share_video_recommend.ShareVideoRecommend/GetFeed?g_tk=0&bkn=0"
data = {"user": {"account": {"account_type": 1, "user_id": "0", "req_recommend_flag": 0}},
"device": {"app_version": "0", "qua": "", "os": 3, "device_id": "", "terminal_id": "", "app_type": 3,
"guid": "", "ip": "", "network": 0}, "share_rowkey": key,
"page": {"tab_id": "", "rowkeys": [key], "load_more_count": 0, "refresh_count": 0,
"load_type": 1}, "cookie": "", "ext": {}}
return requests.post(url, json=data).json()['result']['feedData']['feeds'][0]['card']['feed']['tweet']['post']['video']['url']
@bcc.receiver("FriendMessage")
async def friend_message_listener(message: MessageChain, app: GraiaMiraiApplication, friend: Friend):
if message.get(App):
con=message.get(App)[0].content
con=json.loads(con)
url=con['meta']['data']['contentJumpUrl']
key=url.split('&')[3].split('=')[1]
await app.sendFriendMessage(friend, MessageChain.create([Plain(qqkandian(key))]))
app.launch_blocking()
graia的配置可以看我的上一篇文章
运行之后向机器人转发消息就可以看到视频的链接了