├── 屏幕快照 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 | 
18 | 点赞的视频
19 | 
20 | 评论
21 | 
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 |
--------------------------------------------------------------------------------