├── 屏幕快照 2018-10-20 下午11.41.12.png ├── 屏幕快照 2018-10-20 下午11.41.21.png ├── 屏幕快照 2018-10-20 下午11.41.28.png ├── requirements.txt ├── README.md └── 抖音 ├── comment.py ├── favorite.py ├── follower.py └── api.py /屏幕快照 2018-10-20 下午11.41.12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jk50505k/douyin_api/HEAD/屏幕快照 2018-10-20 下午11.41.12.png -------------------------------------------------------------------------------- /屏幕快照 2018-10-20 下午11.41.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jk50505k/douyin_api/HEAD/屏幕快照 2018-10-20 下午11.41.21.png -------------------------------------------------------------------------------- /屏幕快照 2018-10-20 下午11.41.28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jk50505k/douyin_api/HEAD/屏幕快照 2018-10-20 下午11.41.28.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Flask_HTTPAuth==3.2.4 2 | Flask==0.12 3 | requests==2.12.4 4 | Flask_RESTful==0.3.6 5 | beautifulsoup4==4.6.3 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # douyin_api 2 | 提供查看抖音评论,点赞,粉丝的API接口,封装在本地服务器 3 | ## 使用方法 4 | pip install -r requirements.txt
5 | 在目录内输入:
6 | python api.py
7 | 浏览其输入:127.0.0.1:5000 显示"This is DouYin API"即成功 8 | ## 接口文档 9 | |接口地址 | 参数名 | 调用例子 | 返回参数| 10 | | -------- | :------: | :----: | :----: | 11 | | /comment/
(视频评论) | aweme_id
(视频分享链接)
cursor
(起始的视频序号) | http://127.0.0.1:5000/comment/?aweme_id=http://v.douyin.com/dQxxCw/&cursor=0 | info :数据
more: 是否有下一页 | 12 | | /favorite/
(用户喜欢的视频) | user_id
(用户主页分享链接)
max_cursor
(页号,第一页默认为0) | http://127.0.0.1:5000/favorite/?user_id=http://v.douyin.com/dv8GHj/&max_cursor=0 | info: 数据
more :是否有下一页
max_cursor :下一页的页号 | 13 | | /follower/
(用户的粉丝) | $user_id
(用户主页分享链接)
max_time
(页号,入口页号默认为1538215804) | http://127.0.0.1:5000/follower/?user_id=http://v.douyin.com/dv8GHj/&max_time=1538215804 | info: 数据
more :是否有下一页
max_time :下一页的页号
firstPage:第一页页号 | 14 | 15 | ## 使用效果 16 | 粉丝
17 | ![follower ]( https://github.com/jk50505k/douyin_api/blob/master/屏幕快照%202018-10-20%20下午11.41.12.png) 18 | 点赞的视频
19 | ![favorite ](https://github.com/jk50505k/douyin_api/blob/master/屏幕快照%202018-10-20%20下午11.41.21.png) 20 | 评论
21 | ![comment](https://github.com/jk50505k/douyin_api/blob/master/屏幕快照%202018-10-20%20下午11.41.28.png) 22 | -------------------------------------------------------------------------------- /抖音/comment.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # encoding: utf-8 3 | import requests 4 | import time 5 | import random 6 | 7 | header={'User-Agent': 'Aweme/25010 CFNetwork/902.2 Darwin/17.7.0'} 8 | 9 | commentList=[] 10 | cursor=0 11 | more=1 12 | 13 | def getAwemeIdByShortUrl(url): 14 | try: 15 | return requests.get(url, headers=header, allow_redirects=False).headers['location'].split("/video/")[1].split("/")[0] 16 | except: 17 | return "" 18 | 19 | def getID(url): 20 | global aweme_id 21 | aweme_id = getAwemeIdByShortUrl(url) 22 | if aweme_id == "": 23 | print("短链接错误") 24 | #exit(-1) 25 | return "wrong url" 26 | return aweme_id 27 | 28 | 29 | 30 | postParams={ 31 | "aweme_id": '', 32 | "comment_style": "2", 33 | "cursor": str(cursor), 34 | 'count':'40', 35 | 'aid':"1128" 36 | } 37 | 38 | 39 | 40 | def apiComment(aweme_id,cursor): 41 | comment={} 42 | postParams['cursor']=cursor 43 | postParams['aweme_id'] = str(aweme_id) 44 | r = requests.get("https://aweme.snssdk.com/aweme/v1/comment/list/", params=postParams, headers=header) 45 | resp = r.json() 46 | #print(resp) 47 | more = {'more':resp['has_more']} 48 | comments = resp['comments'] 49 | for i in comments: 50 | comment[i['user']['nickname'] + '(' + i['user']['short_id'] + ')']=i['text'] 51 | return comment,more 52 | 53 | 54 | if __name__ == '__main__': 55 | pass 56 | #print(apiComment('6598428630131412232', 0)) 57 | 58 | -------------------------------------------------------------------------------- /抖音/favorite.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | import time 4 | import random 5 | header={'User-Agent': 'Aweme/25010 CFNetwork/902.2 Darwin/17.7.0'} 6 | 7 | max_cursor=0 8 | 9 | 10 | 11 | postParams={ 12 | "user_id": '', 13 | 'count' : '21' , 14 | 'max_cursor' : str(max_cursor), 15 | 'min_cursor':'0', 16 | 'aid':'1128' 17 | 18 | } 19 | 20 | 21 | 22 | def getUrl(urlList): 23 | global playList 24 | playList=[] 25 | for i in urlList: 26 | address=i['video']['play_addr']['url_list'][0] 27 | playList.append(address) 28 | #print(address) 29 | 30 | def getFavorite(user_id,max_cursor): 31 | postParams['user_id']=str(user_id) 32 | r = requests.get("https://aweme.snssdk.com/aweme/v1/aweme/favorite/?", params=postParams, headers=header) 33 | result = r.json() 34 | #print(result) 35 | getUrl(result['aweme_list']) 36 | more = result['has_more'] 37 | if more == 1: 38 | max_cursor = result['max_cursor'] 39 | getFavorite(user_id,max_cursor) 40 | 41 | def apiFavorite(user_id,max_cursor): 42 | postParams['user_id']=str(user_id) 43 | r = requests.get("https://aweme.snssdk.com/aweme/v1/aweme/favorite/?", params=postParams,headers=header) 44 | result = r.json() 45 | 46 | getUrl(result['aweme_list']) 47 | max_cursor = {'max_cursor':result['max_cursor']} 48 | more = {'more': result['has_more']} 49 | return playList,max_cursor,more 50 | 51 | if __name__ == '__main__': 52 | pass 53 | #getFavorite(59189910855,max_cursor) 54 | 55 | #print(apiFavorite(59189910855,1541856489000)) 56 | -------------------------------------------------------------------------------- /抖音/follower.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | import time 4 | import random 5 | from bs4 import BeautifulSoup 6 | import re 7 | 8 | header = {'User-Agent': 'Aweme/25010 CFNetwork/902.2 Darwin/17.7.0'} 9 | 10 | max_time='1538215804'#第一页 11 | 12 | 13 | postParams = { 14 | "user_id": str(''), 15 | 'count': '20', 16 | 'max_time': str(max_time), 17 | 'aid':'1128' 18 | } 19 | 20 | 21 | 22 | followersList=[] 23 | def getFollower(user_id,max_time): 24 | postParams['user_id']=user_id 25 | r = requests.get("https://aweme.snssdk.com/aweme/v1/user/follower/list/", params=postParams ,headers=header) 26 | # print(r.url) 27 | result = r.json() 28 | print(result) 29 | # if result['status_code']==2151: 30 | # getFollower(user_id,max_time) 31 | # time.sleep(0.5) 32 | more=result['has_more'] 33 | followers = result['followers'] 34 | for i in followers: 35 | followersList.append(i['nickname' ] + ':' + i['short_id']) 36 | if more ==True: 37 | max_time = result['min_time'] 38 | getFollower(user_id,max_time) 39 | time.sleep(random.random()*2) 40 | if more== False: 41 | print(result) 42 | 43 | def apiFollower(user_id,max_time): 44 | follower={} 45 | postParams['user_id'] = user_id 46 | r = requests.get("https://aweme.snssdk.com/aweme/v1/user/follower/list/", params=postParams, headers=header) 47 | #print(r.url) 48 | result = r.json() 49 | more = {'more':result['has_more']} 50 | followers = result['followers'] 51 | max_time = {'max_time':result['min_time']} 52 | for i in followers: 53 | follower[i['nickname']]=i['short_id'] 54 | return follower,more,max_time 55 | 56 | def getParam(link): 57 | r=requests.get(link,headers=header) 58 | soup=BeautifulSoup(r.content,'html.parser') 59 | script=soup.find_all('script',attrs={'type':'text/javascript'}) 60 | uid_t = re.findall(r'uid\: \"[0-9]+\"', str(script[2])) 61 | uid=re.findall(r'\d+',uid_t[0])[0] 62 | #print(uid) 63 | return uid 64 | 65 | # getFollower('15',max_time) 66 | # print(len(followersList)) 67 | # print(followersList) 68 | #print(apiFollower(getParam('http://v.douyin.com/dv8GHj/'), max_time)) 69 | -------------------------------------------------------------------------------- /抖音/api.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, g 2 | from flask_restful import reqparse, Api, Resource 3 | from flask_httpauth import HTTPTokenAuth 4 | from comment import * 5 | from favorite import * 6 | from follower import * 7 | from search1 import * 8 | import time 9 | import os 10 | # Flask相关变量声明 11 | app = Flask(__name__) 12 | api = Api(app) 13 | 14 | # RESTfulAPI的参数解析 -- put / post参数解析 15 | parser_put = reqparse.RequestParser() 16 | 17 | # 操作(post / get)资源列表 18 | class commentTodoList(Resource):#评论 19 | 20 | def get(self): 21 | try: 22 | parser_put.add_argument("aweme_id", type=str, required=True, help="error") 23 | parser_put.add_argument("cursor", type=str, required=True, help="error") 24 | 25 | args = parser_put.parse_args() 26 | aweme_id = args['aweme_id'] 27 | cursor = args['cursor'] 28 | info = {"info": apiComment(getID(aweme_id),cursor )} 29 | parser_put.remove_argument("aweme_id") 30 | parser_put.remove_argument("cursor") 31 | return info, 200 32 | except: 33 | parser_put.remove_argument("aweme_id") 34 | parser_put.remove_argument("cursor") 35 | return 400 36 | 37 | 38 | class favoriteTodoList(Resource):#喜欢 39 | 40 | def get(self): 41 | try: 42 | parser_put.add_argument("max_cursor", type=str, required=True, help="error") 43 | parser_put.add_argument("user_id", type=str, required=True, help="error") 44 | args = parser_put.parse_args() 45 | user_id = args['user_id'] 46 | max_cursor = args['max_cursor'] 47 | info = {"info": apiFavorite(getParam(user_id),max_cursor)} 48 | parser_put.remove_argument("max_cursor") 49 | parser_put.remove_argument("user_id") 50 | return info ,200 51 | except: 52 | parser_put.remove_argument("max_cursor") 53 | parser_put.remove_argument("user_id") 54 | return 400 55 | class followerTodoList(Resource):#粉丝 56 | 57 | def get(self): 58 | try: 59 | parser_put.add_argument("user_id", type=str, required=True, help="error") 60 | parser_put.add_argument("max_time", type=str, required=True, help="error") 61 | args = parser_put.parse_args() 62 | user_id = args['user_id'] 63 | max_time = args['max_time'] 64 | info = {"info": apiFollower(getParam(user_id),max_time)} 65 | parser_put.remove_argument("max_time") 66 | parser_put.remove_argument("user_id") 67 | return info ,200 68 | except: 69 | parser_put.remove_argument("max_time") 70 | parser_put.remove_argument("user_id") 71 | return 400 72 | 73 | class getaweme_id(Resource):#获取视频id 74 | def get(self): 75 | parser_put.add_argument("url", type=str, required=True, help="error") 76 | args = parser_put.parse_args() 77 | url = args['url'] 78 | aweme_id={"aweme_id":getID(url)} 79 | parser_put.remove_argument("url") 80 | return aweme_id,200 81 | 82 | class user_id(Resource):#获取用户id 83 | def get(self): 84 | parser_put.add_argument("link", type=str, required=True, help="error") 85 | args = parser_put.parse_args() 86 | link = args['link'] 87 | user_id={"user_id":getParam(link)} 88 | parser_put.remove_argument("link") 89 | return user_id,200 90 | 91 | class search(Resource):#搜索关键字 92 | def get(self): 93 | try: 94 | parser_put.add_argument("keyword", type=str, required=True, help="error") 95 | parser_put.add_argument("offset", type=str, required=True, help="error") 96 | args = parser_put.parse_args() 97 | keyword=args['keyword'] 98 | offset=args['offset'] 99 | info={"info":apiSearch(keyword,offset)} 100 | parser_put.remove_argument("keyword") 101 | parser_put.remove_argument("offset") 102 | return info,200 103 | except: 104 | parser_put.remove_argument("keyword") 105 | parser_put.remove_argument("offset") 106 | return 400 107 | 108 | 109 | class index(Resource):#主页 110 | def get(self): 111 | return 'This is DouYin API',200 112 | 113 | # 设置路由,即路由地址为http://127.0.0.1:5000/ 114 | api.add_resource(commentTodoList, "/comment/") 115 | api.add_resource(favoriteTodoList,'/favorite/') 116 | api.add_resource(getaweme_id,'/getid/') 117 | api.add_resource(followerTodoList,'/follower/') 118 | api.add_resource(user_id,'/user/') 119 | api.add_resource(search,'/search/') 120 | api.add_resource(index,'/') 121 | 122 | if __name__ == "__main__": 123 | app.run(host='0.0.0.0',debug=True) 124 | 125 | 126 | 127 | --------------------------------------------------------------------------------