forked from sengeiou/91pornBot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpornbot.py
297 lines (234 loc) · 10.8 KB
/
pornbot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
import asyncio
import uvloop
from pyp.play import getMaDou, getHs, getVideoInfo91, page91Index, get91Home
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
import datetime
import os
import shutil
from apscheduler.schedulers.asyncio import AsyncIOScheduler
import redis
# import socks
from telethon import TelegramClient, events
from urllib import parse
import util
captionTemplate = '''标题: %s
收藏: %s
作者: %s
关键词: %s
'''
captionTemplateMd = '''标题: %s
'''
REDIS_HOST = os.getenv('REDIS_HOST')
REDIS_PORT = int(os.getenv('REDIS_PORT'))
REDIS_PASS = os.getenv('REDIS_PASS')
API_ID = int(os.getenv('API_ID'))
API_HASH = os.getenv('API_HASH')
BOT_TOKEN = os.getenv('BOT_TOKEN')
GROUP_ID = int(os.getenv('GROUP_ID'))
cron_hour_91 = int(os.getenv('CRON_HOUR_91', '6'))
cron_minute_91 = int(os.getenv('CRON_MINUTE_91', '50'))
bot = TelegramClient(None, API_ID, API_HASH,
# proxy=(socks.HTTP, '127.0.0.1', 10809)
).start(
bot_token=BOT_TOKEN)
redis_conn = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASS, db=1, decode_responses=True)
async def saveToredis(key, message_id, user_id):
redis_conn.set(key, str(message_id) + ',' + str(user_id))
async def getFromredis(key):
get = redis_conn.get(key)
if get is not None:
messList = get.split(',')
return int(messList[0]), int(messList[1])
else:
return 0, 0
@bot.on(events.NewMessage(pattern='/start'))
async def send_welcome(event):
await event.client.send_message(event.chat_id, '向我发送91视频链接,获取视频,有问题请留言 ')
@bot.on(events.NewMessage(pattern='/get91home'))
async def send_welcome(event):
await event.client.send_message(event.chat_id, '免翻地址: ' + await get91Home())
@bot.on(events.NewMessage(pattern='/help'))
async def send_welcome(event):
await event.client.send_message(event.chat_id, '''常见问题:
1.如何设置用户名?
点击头像设置.
2.我发送的链接后,没收到视频
部分高清视频刚发布后还在转码,大概在视频发布时间一小时后再尝试发送链接下载.
''')
@bot.on(events.NewMessage)
async def echo_all(event):
text = event.text
sender = await event.get_sender()
if event.is_private:
if 'viewkey' in text: # 处理91的视频
params = parse.parse_qs(parse.urlparse(text).query)
viewkey = params['viewkey'][0]
viewkey_url = 'https://91porn.com/view_video.php?viewkey=' + viewkey
# redis查询历史数据
mid, uid = await getFromredis(viewkey)
try:
await event.client.forward_messages(event.chat_id, mid, uid)
return
except:
print("消息已被删除或不存在,无法转发")
await handle91(event, viewkey, viewkey_url)
elif 'hsex.men/video-' in text: # 补充,不向redis存了
sender = await event.get_sender()
await handleHs(event, sender, text)
elif '/vod/play/id' in text:
# 解析视频id
path = parse.urlparse(text).path
viewkey = 'md' + path.split('/')[5]
viewkey_url = text
# redis查询历史数据
mid, uid = await getFromredis(viewkey)
try:
await event.client.forward_messages(event.chat_id, mid, uid)
return
except:
print("消息已被删除或不存在,无法转发")
await handleMd(event, viewkey, viewkey_url)
else:
print("None")
async def handleMd(event, viewkey, viewkey_url):
# 获取视频信息
try:
m3u8Url, title = await getMaDou(viewkey_url)
msg1 = await event.client.send_message(event.chat_id,
'真实视频地址:' + m3u8Url + ' ,正在下载中... ,请不要一次性发送大量链接,被发现后会被封禁! ! !')
await util.download91(m3u8Url, viewkey)
# 截图
await util.imgCoverFromFile(viewkey + '/' + viewkey + '.mp4', viewkey + '/' + viewkey + '.jpg')
msg = await event.reply(
'视频下载完成,正在上传。。。如果长时间没收到视频,请重新发送链接')
# 发送视频
message = await event.client.send_file(event.chat_id,
viewkey + '/' + viewkey + '.mp4',
supports_streaming=True,
thumb=viewkey + '/' + viewkey + '.jpg',
caption=captionTemplateMd % (title),
reply_to=event.id,
)
await msg.delete()
await msg1.delete()
await saveToredis(viewkey, message.id, message.peer_id.user_id)
print(str(datetime.datetime.now()) + ':' + title + ' 发送成功')
finally:
shutil.rmtree(viewkey, ignore_errors=True)
async def handleHs(event, sender, text):
p = parse.urlparse(text)
viewkey = p.path.replace('/', '')
print("消息来自:" + str(sender.username), ":", text)
try:
videoInfo = await getHs(text)
await util.download91(videoInfo.realM3u8, viewkey, 5)
# 截图
await util.imgCover(videoInfo.imgUrl, viewkey + '/' + viewkey + '.jpg')
segstr = await util.seg(videoInfo.title)
msg = await event.reply(
'视频下载完成,正在上传。。。如果长时间没收到视频,请重新发送链接')
# 发送视频
await event.client.send_file(event.chat_id,
viewkey + '/' + viewkey + '.mp4',
supports_streaming=True,
thumb=viewkey + '/' + viewkey + '.jpg',
caption=captionTemplate % (
videoInfo.title, '000', '#' + videoInfo.author, segstr),
reply_to=event.id,
)
await msg.delete()
print(str(datetime.datetime.now()) + ':' + videoInfo.title + ' 发送成功')
finally:
shutil.rmtree(viewkey, ignore_errors=True)
async def handle91(event, viewkey, viewkey_url):
try:
videoinfo, err_msg = await getVideoInfo91(viewkey_url)
if err_msg is not None:
await event.reply(
err_msg)
return
msg1 = await event.client.send_message(event.chat_id,
'真实视频地址:' + videoinfo.realM3u8 + ' ,正在下载中... ,请不要一次性发送大量链接,被发现后会被封禁! ! !')
title = videoinfo.title
if not os.path.exists(viewkey):
os.makedirs(viewkey)
if '.mp4' in videoinfo.realM3u8:
await util.run(videoinfo.realM3u8, viewkey)
else:
try:
await util.download91(videoinfo.realM3u8, viewkey)
except ValueError:
await event.reply(
'该视频高清版转码未完成,请等待转码完成后再发送链接,转码完成一般在视频发布1小时后')
return
# 截图
await util.imgCoverFromFile(viewkey + '/' + viewkey + '.mp4', viewkey + '/' + viewkey + '.jpg')
segstr = await util.seg(title)
await cut_video91(viewkey)
msg = await event.reply(
'视频下载完成,正在上传。。。如果长时间没收到视频,请重新发送链接')
# 发送视频
message = await event.client.send_file(event.chat_id,
# viewkey + '/' + 'seg_' + viewkey + '.mp4' if is_seg else viewkey + '/' + viewkey + '.mp4',
viewkey + '/' + 'seg_' + viewkey + '.mp4',
supports_streaming=True,
thumb=viewkey + '/' + viewkey + '.jpg',
caption=captionTemplate % (
title, videoinfo.scCount, '#' + videoinfo.author, segstr),
reply_to=event.id,
)
await msg.delete()
await msg1.delete()
await saveToredis(viewkey, message.id, message.peer_id.user_id)
print(str(datetime.datetime.now()) + ':' + title + ' 发送成功')
finally:
shutil.rmtree(viewkey, ignore_errors=True)
async def cut_video91(viewkey):
# 获取视频时长
duration = util.getVideoDuration(viewkey + '/' + viewkey + '.mp4')
await util.segVideo(viewkey + '/' + viewkey + '.mp4', viewkey + '/' + 'seg_' + viewkey + '.mp4',
start='0' if duration < 2 * 60 else '10')
# 首页视频下载发送
async def page91DownIndex():
urls, titles, authors, scCounts = await page91Index()
# print(urls)
for i in range(len(urls)):
url = urls[i]
params = parse.parse_qs(parse.urlparse(url).query)
viewkey = params['viewkey'][0]
try:
videoinfo, err_msg = await getVideoInfo91(url)
if err_msg is not None:
continue
# 下载视频
await util.download91(videoinfo.realM3u8, viewkey)
except:
print('转码失败')
shutil.rmtree(viewkey, ignore_errors=True)
continue
# 截图
await util.imgCoverFromFile(viewkey + '/' + viewkey + '.mp4', viewkey + '/' + viewkey + '.jpg')
segstr = await util.seg(titles[i])
# 发送视频
await cut_video91(viewkey)
message = await bot.send_file(GROUP_ID,
# viewkey + '/' + 'seg_' + viewkey + '.mp4' if is_seg else viewkey + '/' + viewkey + '.mp4',
viewkey + '/' + 'seg_' + viewkey + '.mp4',
supports_streaming=True,
thumb=viewkey + '/' + viewkey + '.jpg',
caption=captionTemplate % (
titles[i], scCounts[i], '#' + authors[i].strip(), segstr),
)
shutil.rmtree(viewkey, ignore_errors=True)
await saveToredis(viewkey, message.id, GROUP_ID)
async def main():
scheduler = AsyncIOScheduler(timezone='Asia/Shanghai')
scheduler.add_job(page91DownIndex, 'cron', hour=cron_hour_91, minute=cron_minute_91)
scheduler.start()
print('bot启动了!!!')
loop = asyncio.get_event_loop()
try:
loop.create_task(main())
loop.run_forever()
except KeyboardInterrupt:
pass