├── README.md ├── main.py └── requirements.txt /README.md: -------------------------------------------------------------------------------- 1 | 1. 安装requirements.txt依赖 2 | 2. 修改main.py中的bot token和管理员tg id 3 | 3. 运行程序并挂起 4 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import telebot 2 | from telebot import types 3 | import requests 4 | import os 5 | from time import sleep 6 | import warnings 7 | 8 | 9 | bot = telebot.TeleBot('你的bot token') 10 | admin_id = [管理员1的tg id, 管理员2的tg id] 11 | 12 | # apis = ['咪狐:mihu', '卡哇伊:kawayi', '蜜桃:mitao', '套路:taolu', '蛟龙:jiaolong','花蝴蝶:huahudie ', '蜜桃:mitao', 'love:love', '小妲己:xiaodaji', '77直播:77zhibo', '依依:yiyi', '日出:richu', '久久:jiujiu', '彩虹:caihong', '蝶恋:dielian', '夜妖姬:yeyaoji', '樱花:yinghua', '享色:xiangse', '红浪漫:honglangman', '金鱼:jinyu', '桃花:taohua', '花房:huafang', '小仙女:xiaoxiannv', '视觉秀:shijuexiu', '小天使:xiaotianshi', '彩云:caiyun', '暗语:anyu', '咪咪:mimi', '娇媚:jiaomei', '黄瓜:huanggua', '色趣:sequ', '糯米:nuomi', '爱爱你:aiaini', '樱花雨i:yinghuayui', '夜来香:yelaixiang', '爱零:ailing', '盘他:panta', '小蜜蜂:xiaomifeng', '桃花运:taohuayun', '夜色:yese', '蝴蝶:hudie', '小天仙:xiaotianxian', '杏趣:xingqu', '小坏蛋:xiaohuaidan', '飘雪:piaoxue', '樱桃:yingtao', '卡路里:kaluli', '小黄书:xiaohuangshu', '二嫂:ersao', '花果山:huaguoshan', '云鹿:yunlu', '菠萝:boluo', '星宝贝:xingbaobei', '夜艳:yeyan', '兰桂坊:languifang', 'dancelife:dancelife', '小萌猪:xiaomengzhu', '蝴蝶飞:hudiefei', '幽梦:youmeng', '丽柜厅:liguiting', '颜如玉:yanruyu', '橙秀:chengxiu', '豹娱l:baoyul', '小花螺:xiaohualuo', '皇后:huanghou', '心之恋:xinzhilian', '台妹l:taimeil', '亚米:yami', '爱恋:ailian', '903娱乐:903yule', '九尾狐:jiuweihu', '尤物岛:youwudao', '夜女郎:yenulang', '娇喘:jiaochuan', '芒果派:mangguopai', '媚颜:meiyan', '风流:fengliu', '夜律:yelu', '玲珑:linglong', '浴火:yuhuo', '翠鸟:cuiniao', '幸运星:xingyunxing', '她秀:taxiu', '招财猫:zhaocaimao', '双碟:shuangdie', '糖果:tangguo', '么么哒:memeda', '小性感:xiaoxinggan', '小喵宠:xiaomiaochong', '兔女郎:tunulang', '睡美人:shuimeiren', '金呗:jinbei', '美夕:meixi', '小妖:xiaoyao', '约直播:yuezhibo', '花仙子:huaxianzi', '土豪:tuhao', '红妆:hongzhuang', '妞妞:niuniu', '艳后:yanhou', 'moon:moon', '蓝猫:lanmao', '美人妆:meirenzhuang', '入巷:ruxiang', '倾心:qingxin', '小精灵:xiaojingling', '偶遇:ouyu', '灰灰:huihui', '猫头鹰:maotouying', '喜欢你:xihuanni', '夜纯:yechun', '杏播:xingbo', '名流:mingliu', '小辣椒:xiaolajiao', '情趣:qingqu', '小棉袄:xiaomianao'] 13 | apis = ['咪狐:mihu', '卡哇伊:kawayi', '蜜桃:mitao', '套路:taolu', '蛟龙:jiaolong','花蝴蝶:huahudie ', '蜜桃:mitao', 'love:love', '小妲己:xiaodaji', '77直播:77zhibo', '依依:yiyi', '日出:richu', '久久:jiujiu', '彩虹:caihong', '蝶恋:dielian', '夜妖姬:yeyaoji', '樱花:yinghua', '享色:xiangse', '红浪漫:honglangman', '金鱼:jinyu', '桃花:taohua', '花房:huafang', '小仙女:xiaoxiannv', '视觉秀:shijuexiu', '小天使:xiaotianshi', '彩云:caiyun', '暗语:anyu', '咪咪:mimi', '娇媚:jiaomei', '黄瓜:huanggua', '色趣:sequ', '糯米:nuomi', '爱爱你:aiaini', '樱花雨i:yinghuayui', '夜来香:yelaixiang', '爱零:ailing', '盘他:panta', '小蜜蜂:xiaomifeng', '桃花运:taohuayun', '夜色:yese', '蝴蝶:hudie', '小天仙:xiaotianxian', '杏趣:xingqu', '小坏蛋:xiaohuaidan', '飘雪:piaoxue', '樱桃:yingtao', '卡路里:kaluli', '小黄书:xiaohuangshu', '二嫂:ersao', '花果山:huaguoshan', '云鹿:yunlu', '菠萝:boluo', '星宝贝:xingbaobei', '夜艳:yeyan', '兰桂坊:languifang', 'dancelife:dancelife', '小萌猪:xiaomengzhu', '蝴蝶飞:hudiefei', '幽梦:youmeng', '丽柜厅:liguiting', '颜如玉:yanruyu', '橙秀:chengxiu', '豹娱l:baoyul', '小花螺:xiaohualuo', '皇后:huanghou', '心之恋:xinzhilian', '台妹l:taimeil', '亚米:yami', '爱恋:ailian', '903娱乐:903yule', '九尾狐:jiuweihu', '尤物岛:youwudao', '夜女郎:yenulang', '娇喘:jiaochuan', '芒果派:mangguopai', '媚颜:meiyan', '风流:fengliu', '夜律:yelu', '玲珑:linglong', '浴火:yuhuo', '翠鸟:cuiniao', '幸运星:xingyunxing', '她秀:taxiu', '招财猫:zhaocaimao', '双碟:shuangdie', '糖果:tangguo', '么么哒:memeda', '小性感:xiaoxinggan', '小喵宠:xiaomiaochong', '兔女郎:tunulang', '睡美人:shuimeiren', '金呗:jinbei', '美夕:meixi', '小妖:xiaoyao', '约直播:yuezhibo', '花仙子:huaxianzi', '土豪:tuhao'] 14 | anti_add_group = True 15 | 16 | PAGE_SIZE = 98 17 | 18 | project_data = {} 19 | current_api = {} 20 | project_counter = 0 21 | 22 | 23 | @bot.message_handler(commands=['show']) 24 | def send_welcome(message): 25 | buttons = [types.InlineKeyboardButton(api.split(':')[0], callback_data=f"api|{api}|0") for api in apis] 26 | buttons = [buttons[i:i + 5] for i in range(0, len(buttons), 5)] 27 | buttons.append([types.InlineKeyboardButton("❌不想看了", callback_data="close")]) 28 | reply_markup = types.InlineKeyboardMarkup(buttons) 29 | bot.reply_to(message, "请选择要观看的平台", reply_markup=reply_markup) 30 | 31 | 32 | def process_api_selection(chat_id, message_id, api, page): 33 | global project_counter, company 34 | try: 35 | api_url = f"http://api.vipmisss.com:81/xcdsw/json{api}.txt" 36 | response = requests.get(api_url) 37 | data = response.json()['zhubo'] 38 | 39 | start = max(page * PAGE_SIZE, 0) 40 | end = min(start + PAGE_SIZE, len(data)) 41 | page_data = data[start:end] 42 | buttons = [] 43 | for i, item in enumerate(page_data): 44 | project_data[project_counter] = item 45 | button_text = item['title'] 46 | callback_data = f"item|{project_counter}" 47 | button = types.InlineKeyboardButton(text=button_text, callback_data=callback_data) 48 | if i % 2 == 0: 49 | buttons.append([button]) 50 | else: 51 | buttons[-1].append(button) 52 | project_counter += 1 53 | 54 | # navigation_buttons = [] 55 | # if start > 0: 56 | # navigation_buttons.append(types.InlineKeyboardButton("⬅️上一页", callback_data=f"api|{api}|{page - 1}")) 57 | # if end < len(data): 58 | # navigation_buttons.append(types.InlineKeyboardButton("下一页➡️", callback_data=f"api|{api}|{page + 1}")) 59 | # if len(navigation_buttons) > 0: 60 | # buttons.append(navigation_buttons) 61 | 62 | back_button = [ 63 | types.InlineKeyboardButton("🏠换个平台", callback_data="home"), 64 | types.InlineKeyboardButton("❌不想看了", callback_data="close"), 65 | ] 66 | 67 | buttons.append(back_button) 68 | 69 | markup = types.InlineKeyboardMarkup(buttons) 70 | company = api.split(':')[0] 71 | text = f"{company}当前共 {len(data)} 名在线主播,点击按钮预览直播间封面,如果点击按钮获取不到内容,那就是主播离线了。\n\n⚠️*注意:不要点击的太快哦,获取直播源和直播间预览图需要大概一秒钟时间!*" 72 | bot.edit_message_text(chat_id=chat_id, message_id=message_id, text=text, reply_markup=markup, parse_mode='Markdown') 73 | except Exception as e: 74 | print(e) 75 | 76 | 77 | @bot.callback_query_handler(func=lambda call: True) 78 | def handle_query(call): 79 | global company, current_api 80 | chat_id = call.message.chat.id 81 | callback_data = call.data.split('|') 82 | try: 83 | if callback_data[0] == 'api': 84 | api, page = str(callback_data[1]).split(':')[1], int(callback_data[2]) 85 | current_api[chat_id] = api 86 | process_api_selection(chat_id, call.message.message_id, api, page) 87 | 88 | elif callback_data[0] == 'item': 89 | project_id = int(callback_data[1]) 90 | item = project_data.get(project_id) 91 | if item: 92 | title = item['title'] 93 | img = item['img'] 94 | img_name = img.split('/')[-1] 95 | address = item['address'] 96 | message_text = f"*平台:*`{company}`\n*标题:*`{title}`\n\n*直播源*\n`{address}`\n\n使用*VLC播放器*导入直播源即可观看" 97 | 98 | photo = requests.get(url=img, verify=False).content 99 | warnings.filterwarnings("ignore") 100 | if not os.path.exists('./img'): 101 | os.makedirs('./img') 102 | img_path = f'./img/{img_name}.jpg' 103 | with open(img_path, 'wb') as f: 104 | f.write(photo) 105 | f.close() 106 | img_send = open(img_path, 'rb') 107 | markup = types.InlineKeyboardMarkup() 108 | back_btn = types.InlineKeyboardButton(text="❌叉出去", callback_data='close') 109 | markup.add(back_btn) 110 | bot.send_photo(chat_id=chat_id, photo=img_send, caption=message_text, reply_markup=markup, parse_mode='Markdown') 111 | img_send.close() 112 | 113 | elif callback_data[0] == 'close': 114 | bot.delete_message(chat_id, call.message.message_id) 115 | return 116 | 117 | elif callback_data[0] == 'home': 118 | send_welcome(call.message) 119 | 120 | except Exception as t: 121 | print(t) 122 | 123 | 124 | @bot.message_handler(commands=['set']) 125 | def set(message): 126 | global anti_add_group 127 | if message.from_user.id in admin_id: 128 | anti_add_group = not anti_add_group 129 | bot.reply_to(message, f"防拉群已{'开启' if anti_add_group else '关闭'}") 130 | 131 | 132 | @bot.my_chat_member_handler() 133 | def check(message): 134 | if message.new_chat_member.user.id == bot.get_me().id: 135 | try: 136 | if anti_add_group and message.from_user.id not in admin_id: 137 | chat_id = message.chat.id 138 | bot.send_message(chat_id, "❌bot已开启防拉群保护,请联系管理员拉群!", timeout=5) 139 | sleep(1) 140 | bot.leave_chat(chat_id) 141 | else: 142 | pass 143 | except Exception as t: 144 | print(t) 145 | 146 | 147 | if __name__ == '__main__': 148 | print('=====bot已启动=====') 149 | while True: 150 | try: 151 | bot.polling(none_stop=True) 152 | except Exception as e: 153 | print(e) 154 | sleep(30) 155 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pyTelegramBotAPI 2 | requests 3 | --------------------------------------------------------------------------------