├── APTV.png ├── Gather.m3u ├── Migu.m3u ├── NoobIPTV.sh ├── README.md ├── Watchtower.sh └── hosts.txt /APTV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YanG-1989/m3u/4ddb1345004b1eed65a99efda8fb8a6725079d1a/APTV.png -------------------------------------------------------------------------------- /Gather.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U x-tvg-url="https://epg.iill.top/epg" catchup="append" catchup-source="?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}" 2 | 3 | #EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",免费订阅:请勿贩卖... 4 | https://epg.iill.top/v/302.mp4 5 | #EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",维护时间:2025-1-15#佛系维护... 6 | https://epg.iill.top/v/301.mp4 7 | #EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",维护内容:维护 Gather「删除 •IPV6 源」 8 | https://epg.iill.top/v/302.mp4 9 | #EXTINF:-1 tvg-id="免费订阅" tvg-name="免费订阅" tvg-logo="https://epg.iill.top/logo/温馨提示.png" group-title="•温馨「提示」",公告说明:IPV6 暂无 10 | https://epg.iill.top/v/301.mp4 11 | 12 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",晴彩广场舞「IPV4」 13 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011523&livemode=1&stbId=YanG-1989 14 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",晴彩少年「IPV4」 15 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011525&livemode=1&stbId=YanG-1989 16 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",晴彩竞技「IPV4」 17 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011528&livemode=1&stbId=YanG-1989 18 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",晴彩篮球「IPV4」 19 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011529&livemode=1&stbId=YanG-1989 20 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播4K「IPV4」 21 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=YanG-1989 22 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙「IPV4」 23 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005308&livemode=1&stbId=YanG-1989 24 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚「IPV4」 25 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005969&livemode=1&stbId=YanG-1989 26 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛「IPV4」 27 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000007218&livemode=1&stbId=YanG-1989 28 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟜「IPV4」 29 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008001&livemode=1&stbId=YanG-1989 30 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟝「IPV4」 31 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008176&livemode=1&stbId=YanG-1989 32 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟞「IPV4」 33 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008379&livemode=1&stbId=YanG-1989 34 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟟「IPV4」 35 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010129&livemode=1&stbId=YanG-1989 36 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟠「IPV4」 37 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010948&livemode=1&stbId=YanG-1989 38 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟡「IPV4」 39 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000028638&livemode=1&stbId=YanG-1989 40 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟘「IPV4」 41 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000031494&livemode=1&stbId=YanG-1989 42 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟙「IPV4」 43 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000000097&livemode=1&stbId=YanG-1989 44 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟚「IPV4」 45 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002019&livemode=1&stbId=YanG-1989 46 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟛「IPV4」 47 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002809&livemode=1&stbId=YanG-1989 48 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟜「IPV4」 49 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000003915&livemode=1&stbId=YanG-1989 50 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟝「IPV4」 51 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000004193&livemode=1&stbId=YanG-1989 52 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟞「IPV4」 53 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005837&livemode=1&stbId=YanG-1989 54 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟟「IPV4」 55 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006077&livemode=1&stbId=YanG-1989 56 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟠「IPV4」 57 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006658&livemode=1&stbId=YanG-1989 58 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟙𝟡「IPV4」 59 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000009788&livemode=1&stbId=YanG-1989 60 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟘「IPV4」 61 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000010833&livemode=1&stbId=YanG-1989 62 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟙「IPV4」 63 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011297&livemode=1&stbId=YanG-1989 64 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟚「IPV4」 65 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011518&livemode=1&stbId=YanG-1989 66 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟛「IPV4」 67 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012558&livemode=1&stbId=YanG-1989 68 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟜「IPV4」 69 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012616&livemode=1&stbId=YanG-1989 70 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟝「IPV4」 71 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015470&livemode=1&stbId=YanG-1989 72 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟞「IPV4」 73 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015560&livemode=1&stbId=YanG-1989 74 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟟「IPV4」 75 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000017678&livemode=1&stbId=YanG-1989 76 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟠「IPV4」 77 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000019839&livemode=1&stbId=YanG-1989 78 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟚𝟡「IPV4」 79 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000021904&livemode=1&stbId=YanG-1989 80 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟘「IPV4」 81 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000023434&livemode=1&stbId=YanG-1989 82 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟙「IPV4」 83 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000025380&livemode=1&stbId=YanG-1989 84 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟚「IPV4」 85 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000027691&livemode=1&stbId=YanG-1989 86 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟛「IPV4」 87 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000031669&livemode=1&stbId=YanG-1989 88 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟜「IPV4」 89 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011518&livemode=1&stbId=YanG-1989 90 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟝「IPV4」 91 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011519&livemode=1&stbId=YanG-1989 92 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟞「IPV4」 93 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011520&livemode=1&stbId=YanG-1989 94 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟟「IPV4」 95 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011521&livemode=1&stbId=YanG-1989 96 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「IPV4」",咪咕直播 𝟛𝟠「IPV4」 97 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011522&livemode=1&stbId=YanG-1989 98 | 99 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」热门赛事 100 | http://dns.yiandrive.com:15907/bilibili/10 101 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」CS 2 102 | https://live.iill.top/bilibili/21622811 103 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」CS 2 104 | https://live.iill.top/huya/483917 105 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」英雄联盟 106 | https://live.iill.top/bilibili/6 107 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」英雄联盟 𝟙 108 | https://live.iill.top/huya/660000 109 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」英雄联盟 𝟚 110 | https://live.iill.top/huya/660001 111 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」英雄联盟 𝟙 112 | https://live.iill.top/douyu/288016 113 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」英雄联盟 𝟚 114 | https://live.iill.top/douyu/424559 115 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」英雄联盟•手游 116 | https://live.iill.top/bilibili/23138275 117 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」王者荣耀 𝟙 118 | https://live.iill.top/bilibili/55 119 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」王者荣耀 𝟚 120 | https://live.iill.top/bilibili/21654762 121 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」王者荣耀 𝟙 122 | https://live.iill.top/huya/660002 123 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」王者荣耀 𝟚 124 | https://live.iill.top/huya/660164 125 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」王者荣耀 𝟙 126 | https://live.iill.top/douyu/1863767 127 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」王者荣耀 𝟚 128 | https://live.iill.top/douyu/1984839 129 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」绝地求生 130 | https://live.iill.top/bilibili/98 131 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」绝地求生 𝟙 132 | https://live.iill.top/huya/660004 133 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」绝地求生 𝟚 134 | https://live.iill.top/huya/660005 135 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」绝地求生 136 | https://live.iill.top/douyu/100 137 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」和平精英 138 | https://live.iill.top/huya/660006 139 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」和平精英 140 | https://live.iill.top/douyu/999 141 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」金铲铲之战 142 | https://live.iill.top/huya/660579 143 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」金铲铲之战 144 | https://live.iill.top/douyu/9715241 145 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」DOTA2 146 | https://live.iill.top/huya/660118 147 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」DOTA2 148 | https://live.iill.top/douyu/3811559 149 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」云顶之弈 150 | https://live.iill.top/douyu/522423 151 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」永劫无间 152 | https://live.iill.top/huya/660115 153 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」永劫无间 154 | https://live.iill.top/huya/9662891 155 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」使命召唤•手游 156 | https://live.iill.top/bilibili/22741849 157 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」使命召唤•手游 158 | https://live.iill.top/huya/11718629 159 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」使命召唤•手游 160 | https://live.iill.top/douyu/9223245 161 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」穿越火线 162 | https://live.iill.top/huya/660101 163 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」穿越火线 𝟙 164 | https://live.iill.top/douyu/605964 165 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」穿越火线 𝟚 166 | https://live.iill.top/douyu/5388537 167 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」穿越火线•手游 168 | https://live.iill.top/huya/660102 169 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」第五人格 170 | https://live.iill.top/bilibili/5555 171 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」第五人格 172 | https://live.iill.top/huya/idvesports 173 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」第五人格 174 | https://live.iill.top/douyu/3226194 175 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」逆战 176 | https://live.iill.top/huya/nsl2021 177 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」无畏契约 178 | https://live.iill.top/bilibili/22908869 179 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•游戏「赛事」",「虎牙」无畏契约 180 | https://live.iill.top/huya/660679 181 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」无畏契约 182 | https://live.iill.top/douyu/4585645 183 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」原神 184 | https://live.iill.top/douyu/10853239 185 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」QQ飞车•手游 186 | https://live.iill.top/bilibili/21743919 187 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」QQ飞车•手游 188 | https://live.iill.top/douyu/5040227 189 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」梦幻西游·手游 190 | https://live.iill.top/huya/9163712 191 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」街霸 192 | https://live.iill.top/huya/11437 193 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/哔哩哔哩.png" group-title="•游戏「赛事」",「B站」JJ斗地主 194 | https://live.iill.top/bilibili/22021983 195 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」JJ斗地主 196 | https://live.iill.top/douyu/488743 197 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」我的世界 198 | https://live.iill.top/douyu/738878 199 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」FIFA 200 | https://live.iill.top/douyu/7692166 201 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」火影忍者 202 | https://live.iill.top/douyu/1997723 203 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」跑跑卡丁车 204 | https://live.iill.top/douyu/7722576 205 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/斗鱼.png" group-title="•游戏「赛事」",「斗鱼」跑跑卡丁车•手游 206 | https://live.iill.top/douyu/6672862 207 | 208 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",音乐石榴「音乐」 209 | https://live.iill.top/huya/17091681 210 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",音乐速递「音乐」 211 | https://live.iill.top/huya/19439762 212 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",治愈•放松「音乐」 213 | https://live.iill.top/huya/21241811 214 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",阅读•学习「音乐」 215 | https://live.iill.top/huya/21241813 216 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电视剧•1「解说」 217 | https://live.iill.top/huya/21277391 218 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电视剧•2「解说」 219 | https://live.iill.top/huya/25018873 220 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电影•1「解说」 221 | https://live.iill.top/huya/20289754 222 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电影•2「解说」 223 | https://live.iill.top/huya/24983280 224 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",电影•3「解说」 225 | https://live.iill.top/huya/24396428 226 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",动漫•1「解说」 227 | https://live.iill.top/huya/19757963 228 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",恐怖电影「解说」 229 | https://live.iill.top/huya/23419131 230 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",漫威「解说」 231 | https://live.iill.top/huya/17089779 232 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",美剧「解说」 233 | https://live.iill.top/huya/20488841 234 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",七龙珠「解说」 235 | https://live.iill.top/huya/25650806 236 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",止戈电影「解说」 237 | https://live.iill.top/huya/19863777 238 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",挨饿德•1「其他」 239 | https://live.iill.top/huya/20985858 240 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",挨饿德•2「其他」 241 | https://live.iill.top/huya/17693860 242 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",互扇巴掌大赛「其他」 243 | https://live.iill.top/huya/20072873 244 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",荒野求生「其他」 245 | https://live.iill.top/huya/593667 246 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",野行者「其他」 247 | https://live.iill.top/huya/20072663 248 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",跳舞「其他」 249 | https://live.iill.top/huya/24634408 250 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",茶啊二中「动画」 251 | https://live.iill.top/huya/11213191 252 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",哆啦A梦「动漫」 253 | https://live.iill.top/huya/11601963 254 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",航海王「动漫」 255 | https://live.iill.top/huya/16913382 256 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",七龙珠「动漫」 257 | https://live.iill.top/huya/11601966 258 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",猫和老鼠「动漫」 259 | https://live.iill.top/huya/11352879 260 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/虎牙.png" group-title="•影视「轮播」",中华小当家「动漫」 261 | https://live.iill.top/huya/11342413 262 | -------------------------------------------------------------------------------- /Migu.m3u: -------------------------------------------------------------------------------- 1 | #EXTM3U 2 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩广场舞「移动」 3 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011523/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011523&livemode=1&stbId=YanG-1989 4 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩少年「移动」 5 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011525/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011525&livemode=1&stbId=YanG-1989 6 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩竞技「移动」 7 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011528/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011528&livemode=1&stbId=YanG-1989 8 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",晴彩篮球「移动」 9 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011529/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011529&livemode=1&stbId=YanG-1989 10 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播4K「移动」 11 | http://gslbserv.itv.cmvideo.cn:80/3000000010000005180/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=YanG-1989 12 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙「移动」 13 | http://gslbserv.itv.cmvideo.cn:80/3000000001000005308/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005308&livemode=1&stbId=YanG-1989 14 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚「移动」 15 | http://gslbserv.itv.cmvideo.cn:80/3000000001000005969/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005969&livemode=1&stbId=YanG-1989 16 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛「移动」 17 | http://gslbserv.itv.cmvideo.cn:80/3000000001000007218/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000007218&livemode=1&stbId=YanG-1989 18 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟜「移动」 19 | http://gslbserv.itv.cmvideo.cn:80/3000000001000008001/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008001&livemode=1&stbId=YanG-1989 20 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟝「移动」 21 | http://gslbserv.itv.cmvideo.cn:80/3000000001000008176/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008176&livemode=1&stbId=YanG-1989 22 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟞「移动」 23 | http://gslbserv.itv.cmvideo.cn:80/3000000001000008379/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008379&livemode=1&stbId=YanG-1989 24 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟟「移动」 25 | http://gslbserv.itv.cmvideo.cn:80/3000000001000010129/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010129&livemode=1&stbId=YanG-1989 26 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟠「移动」 27 | http://gslbserv.itv.cmvideo.cn:80/3000000001000010948/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010948&livemode=1&stbId=YanG-1989 28 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟡「移动」 29 | http://gslbserv.itv.cmvideo.cn:80/3000000001000028638/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000028638&livemode=1&stbId=YanG-1989 30 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟘「移动」 31 | http://gslbserv.itv.cmvideo.cn:80/3000000001000031494/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000031494&livemode=1&stbId=YanG-1989 32 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟙「移动」 33 | http://gslbserv.itv.cmvideo.cn:80/3000000010000000097/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000000097&livemode=1&stbId=YanG-1989 34 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟚「移动」 35 | http://gslbserv.itv.cmvideo.cn:80/3000000010000002019/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002019&livemode=1&stbId=YanG-1989 36 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟛「移动」 37 | http://gslbserv.itv.cmvideo.cn:80/3000000010000002809/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002809&livemode=1&stbId=YanG-1989 38 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟜「移动」 39 | http://gslbserv.itv.cmvideo.cn:80/3000000010000003915/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000003915&livemode=1&stbId=YanG-1989 40 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟝「移动」 41 | http://gslbserv.itv.cmvideo.cn:80/3000000010000004193/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000004193&livemode=1&stbId=YanG-1989 42 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟞「移动」 43 | http://gslbserv.itv.cmvideo.cn:80/3000000010000005837/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005837&livemode=1&stbId=YanG-1989 44 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟟「移动」 45 | http://gslbserv.itv.cmvideo.cn:80/3000000010000006077/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006077&livemode=1&stbId=YanG-1989 46 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟠「移动」 47 | http://gslbserv.itv.cmvideo.cn:80/3000000010000006658/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006658&livemode=1&stbId=YanG-1989 48 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟙𝟡「移动」 49 | http://gslbserv.itv.cmvideo.cn:80/3000000010000009788/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000009788&livemode=1&stbId=YanG-1989 50 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟘「移动」 51 | http://gslbserv.itv.cmvideo.cn:80/3000000010000010833/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000010833&livemode=1&stbId=YanG-1989 52 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟙「移动」 53 | http://gslbserv.itv.cmvideo.cn:80/3000000010000011297/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011297&livemode=1&stbId=YanG-1989 54 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟚「移动」 55 | http://gslbserv.itv.cmvideo.cn:80/3000000010000011518/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011518&livemode=1&stbId=YanG-1989 56 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟛「移动」 57 | http://gslbserv.itv.cmvideo.cn:80/3000000010000012558/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012558&livemode=1&stbId=YanG-1989 58 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟜「移动」 59 | http://gslbserv.itv.cmvideo.cn:80/3000000010000012616/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012616&livemode=1&stbId=YanG-1989 60 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟝「移动」 61 | http://gslbserv.itv.cmvideo.cn:80/3000000010000015470/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015470&livemode=1&stbId=YanG-1989 62 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟞「移动」 63 | http://gslbserv.itv.cmvideo.cn:80/3000000010000015560/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015560&livemode=1&stbId=YanG-1989 64 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟟「移动」 65 | http://gslbserv.itv.cmvideo.cn:80/3000000010000017678/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000017678&livemode=1&stbId=YanG-1989 66 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟠「移动」 67 | http://gslbserv.itv.cmvideo.cn:80/3000000010000019839/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000019839&livemode=1&stbId=YanG-1989 68 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟚𝟡「移动」 69 | http://gslbserv.itv.cmvideo.cn:80/3000000010000021904/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000021904&livemode=1&stbId=YanG-1989 70 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟘「移动」 71 | http://gslbserv.itv.cmvideo.cn:80/3000000010000023434/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000023434&livemode=1&stbId=YanG-1989 72 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟙「移动」 73 | http://gslbserv.itv.cmvideo.cn:80/3000000010000025380/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000025380&livemode=1&stbId=YanG-1989 74 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟚「移动」 75 | http://gslbserv.itv.cmvideo.cn:80/3000000010000027691/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000027691&livemode=1&stbId=YanG-1989 76 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟛「移动」 77 | http://gslbserv.itv.cmvideo.cn:80/3000000010000031669/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000031669&livemode=1&stbId=YanG-1989 78 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟜「移动」 79 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011518/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011518&livemode=1&stbId=YanG-1989 80 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟝「移动」 81 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011519/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011519&livemode=1&stbId=YanG-1989 82 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟞「移动」 83 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011520/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011520&livemode=1&stbId=YanG-1989 84 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟟「移动」 85 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011521/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011521&livemode=1&stbId=YanG-1989 86 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「移动」",咪咕直播 𝟛𝟠「移动」 87 | http://gslbserv.itv.cmvideo.cn:80/3000000020000011522/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011522&livemode=1&stbId=YanG-1989 88 | 89 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",晴彩广场舞「IPV4」 90 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011523&livemode=1&stbId=YanG-1989 91 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",晴彩少年「IPV4」 92 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011525&livemode=1&stbId=YanG-1989 93 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",晴彩竞技「IPV4」 94 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011528&livemode=1&stbId=YanG-1989 95 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",晴彩篮球「IPV4」 96 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011529&livemode=1&stbId=YanG-1989 97 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播4K「IPV4」 98 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=YanG-1989 99 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙「IPV4」 100 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005308&livemode=1&stbId=YanG-1989 101 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚「IPV4」 102 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005969&livemode=1&stbId=YanG-1989 103 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛「IPV4」 104 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000007218&livemode=1&stbId=YanG-1989 105 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟜「IPV4」 106 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008001&livemode=1&stbId=YanG-1989 107 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟝「IPV4」 108 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008176&livemode=1&stbId=YanG-1989 109 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟞「IPV4」 110 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008379&livemode=1&stbId=YanG-1989 111 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟟「IPV4」 112 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010129&livemode=1&stbId=YanG-1989 113 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟠「IPV4」 114 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010948&livemode=1&stbId=YanG-1989 115 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟡「IPV4」 116 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000028638&livemode=1&stbId=YanG-1989 117 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟘「IPV4」 118 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000031494&livemode=1&stbId=YanG-1989 119 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟙「IPV4」 120 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000000097&livemode=1&stbId=YanG-1989 121 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟚「IPV4」 122 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002019&livemode=1&stbId=YanG-1989 123 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟛「IPV4」 124 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002809&livemode=1&stbId=YanG-1989 125 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟜「IPV4」 126 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000003915&livemode=1&stbId=YanG-1989 127 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟝「IPV4」 128 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000004193&livemode=1&stbId=YanG-1989 129 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟞「IPV4」 130 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005837&livemode=1&stbId=YanG-1989 131 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟟「IPV4」 132 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006077&livemode=1&stbId=YanG-1989 133 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟠「IPV4」 134 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006658&livemode=1&stbId=YanG-1989 135 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟙𝟡「IPV4」 136 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000009788&livemode=1&stbId=YanG-1989 137 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟘「IPV4」 138 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000010833&livemode=1&stbId=YanG-1989 139 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟙「IPV4」 140 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011297&livemode=1&stbId=YanG-1989 141 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟚「IPV4」 142 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011518&livemode=1&stbId=YanG-1989 143 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟛「IPV4」 144 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012558&livemode=1&stbId=YanG-1989 145 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟜「IPV4」 146 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012616&livemode=1&stbId=YanG-1989 147 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟝「IPV4」 148 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015470&livemode=1&stbId=YanG-1989 149 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟞「IPV4」 150 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015560&livemode=1&stbId=YanG-1989 151 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟟「IPV4」 152 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000017678&livemode=1&stbId=YanG-1989 153 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟠「IPV4」 154 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000019839&livemode=1&stbId=YanG-1989 155 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟚𝟡「IPV4」 156 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000021904&livemode=1&stbId=YanG-1989 157 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟘「IPV4」 158 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000023434&livemode=1&stbId=YanG-1989 159 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟙「IPV4」 160 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000025380&livemode=1&stbId=YanG-1989 161 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟚「IPV4」 162 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000027691&livemode=1&stbId=YanG-1989 163 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟛「IPV4」 164 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000031669&livemode=1&stbId=YanG-1989 165 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟜「IPV4」 166 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011518&livemode=1&stbId=YanG-1989 167 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟝「IPV4」 168 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011519&livemode=1&stbId=YanG-1989 169 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟞「IPV4」 170 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011520&livemode=1&stbId=YanG-1989 171 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟟「IPV4」 172 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011521&livemode=1&stbId=YanG-1989 173 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅰ」",咪咕直播 𝟛𝟠「IPV4」 174 | http://gslbservzqhsw.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011522&livemode=1&stbId=YanG-1989 175 | 176 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",晴彩广场舞「IPV4」 177 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011523&livemode=1&stbId=YanG-1989 178 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",晴彩少年「IPV4」 179 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011525&livemode=1&stbId=YanG-1989 180 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",晴彩竞技「IPV4」 181 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011528&livemode=1&stbId=YanG-1989 182 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",晴彩篮球「IPV4」 183 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011529&livemode=1&stbId=YanG-1989 184 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播4K「IPV4」 185 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=YanG-1989 186 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙「IPV4」 187 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005308&livemode=1&stbId=YanG-1989 188 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚「IPV4」 189 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000005969&livemode=1&stbId=YanG-1989 190 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛「IPV4」 191 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000007218&livemode=1&stbId=YanG-1989 192 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟜「IPV4」 193 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008001&livemode=1&stbId=YanG-1989 194 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟝「IPV4」 195 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008176&livemode=1&stbId=YanG-1989 196 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟞「IPV4」 197 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000008379&livemode=1&stbId=YanG-1989 198 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟟「IPV4」 199 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010129&livemode=1&stbId=YanG-1989 200 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟠「IPV4」 201 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000010948&livemode=1&stbId=YanG-1989 202 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟡「IPV4」 203 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000028638&livemode=1&stbId=YanG-1989 204 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟘「IPV4」 205 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000001000031494&livemode=1&stbId=YanG-1989 206 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟙「IPV4」 207 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000000097&livemode=1&stbId=YanG-1989 208 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟚「IPV4」 209 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002019&livemode=1&stbId=YanG-1989 210 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟛「IPV4」 211 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000002809&livemode=1&stbId=YanG-1989 212 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟜「IPV4」 213 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000003915&livemode=1&stbId=YanG-1989 214 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟝「IPV4」 215 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000004193&livemode=1&stbId=YanG-1989 216 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟞「IPV4」 217 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000005837&livemode=1&stbId=YanG-1989 218 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟟「IPV4」 219 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006077&livemode=1&stbId=YanG-1989 220 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟠「IPV4」 221 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000006658&livemode=1&stbId=YanG-1989 222 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟙𝟡「IPV4」 223 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000009788&livemode=1&stbId=YanG-1989 224 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟘「IPV4」 225 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000010833&livemode=1&stbId=YanG-1989 226 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟙「IPV4」 227 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011297&livemode=1&stbId=YanG-1989 228 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟚「IPV4」 229 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000011518&livemode=1&stbId=YanG-1989 230 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟛「IPV4」 231 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012558&livemode=1&stbId=YanG-1989 232 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟜「IPV4」 233 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000012616&livemode=1&stbId=YanG-1989 234 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟝「IPV4」 235 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015470&livemode=1&stbId=YanG-1989 236 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟞「IPV4」 237 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000015560&livemode=1&stbId=YanG-1989 238 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟟「IPV4」 239 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000017678&livemode=1&stbId=YanG-1989 240 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟠「IPV4」 241 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000019839&livemode=1&stbId=YanG-1989 242 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟚𝟡「IPV4」 243 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000021904&livemode=1&stbId=YanG-1989 244 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟘「IPV4」 245 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000023434&livemode=1&stbId=YanG-1989 246 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟙「IPV4」 247 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000025380&livemode=1&stbId=YanG-1989 248 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟚「IPV4」 249 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000027691&livemode=1&stbId=YanG-1989 250 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟛「IPV4」 251 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000010000031669&livemode=1&stbId=YanG-1989 252 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟜「IPV4」 253 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011518&livemode=1&stbId=YanG-1989 254 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟝「IPV4」 255 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011519&livemode=1&stbId=YanG-1989 256 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟞「IPV4」 257 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011520&livemode=1&stbId=YanG-1989 258 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟟「IPV4」 259 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011521&livemode=1&stbId=YanG-1989 260 | #EXTINF:-1 tvg-logo="https://epg.iill.top/logo/咪咕.png" group-title="•咪咕「网·Ⅱ」",咪咕直播 𝟛𝟠「IPV4」 261 | http://gslbservstudent.itv.cmvideo.cn/index.m3u8?channel-id=FifastbLive&Contentid=3000000020000011522&livemode=1&stbId=YanG-1989 262 | -------------------------------------------------------------------------------- /NoobIPTV.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ############################### 3 | # 名称: NoobIPTV (IPTV 项目相关脚本集合 @小白神器) 4 | # 作者: YanG-1989 5 | # 项目地址:https://github.com/YanG-1989 6 | # 最新版本:2.1.2 7 | ############################### 8 | 9 | # 设置路径 10 | SCRIPT_PATH="$HOME/NoobIPTV.sh" # 定义脚本路径 11 | CONFIG_FILE="$HOME/.NoobIPTV" # 配置文件路径 12 | REVERSE_PROXY="docker.zhai.cm" # 设置反向代理地址 13 | 14 | # 设置颜色变量 15 | RED="\033[1;31m" # 红 16 | GREEN="\033[1;32m" # 绿 17 | YELLOW="\033[1;33m" # 黄 18 | CYAN="\033[1;36m" # 青 19 | RESET="\033[0m" # 重置 20 | 21 | # echo -e "${GREEN}这是绿色粗体文本。${RESET}" 22 | 23 | ############# 菜单 ############# 24 | 25 | # 显示 菜单 26 | show_menu() { 27 | echo "-------------------" 28 | echo " 请选择一个项目: " 29 | echo "-------------------" 30 | echo "1) Pixman 项目 " 31 | echo "2) Fourgtv 项目 " 32 | echo "3) Doubebly 项目 " 33 | echo "~~~~~~~~~~~~~~~~~~~" 34 | echo "4) Docker 管理助手 " 35 | echo "~~~~~~~~~~~~~~~~~~~" 36 | echo "5) -- 工具箱 -- " 37 | echo "~~~~~~~~~~~~~~~~~~~" 38 | echo "6) ~~ 脚本信息 ~~ " 39 | echo "-------------------" 40 | echo "0) 退出 " 41 | echo " [ Ctrl+C ] " 42 | echo "-------------------" 43 | } 44 | 45 | # Pixman 菜单 46 | show_pixman_menu() { 47 | echo "-------------------" 48 | echo " Pixman 菜单: " 49 | echo "-------------------" 50 | echo "1) 安装 Pixman 项目" 51 | echo "2) 卸载 Pixman 项目" 52 | echo "3) 设置 反向代理 地址" 53 | echo "-------------------" 54 | echo "0) 返回主菜单 " 55 | echo "-------------------" 56 | } 57 | 58 | # Fourgtv 菜单 59 | show_fourgtv_menu() { 60 | echo "---------------------" 61 | echo " Fourgtv 菜单: " 62 | echo "---------------------" 63 | echo "1) 安装 Fourgtv 项目 " 64 | echo "2) 卸载 Fourgtv 项目 " 65 | echo "3) 设置 反向代理 地址 " 66 | echo "---------------------" 67 | echo "0) 返回主菜单 " 68 | echo "---------------------" 69 | } 70 | 71 | # Doubebly 菜单 72 | show_doubebly_menu() { 73 | echo "---------------------" 74 | echo " Doubebly 菜单: " 75 | echo "---------------------" 76 | echo "1) 安装 Doubebly 项目" 77 | echo "2) 卸载 Doubebly 项目" 78 | echo "3) 设置 反向代理 地址" 79 | echo "---------------------" 80 | echo "0) 返回主菜单 " 81 | echo "---------------------" 82 | } 83 | 84 | # Watchtower 菜单 85 | show_watchtower_menu() { 86 | echo "----------------------" 87 | echo " Watchtower 菜单: " 88 | echo "----------------------" 89 | echo "1) 一键更新 Docker 项目" 90 | echo "2) 管理 Docker 项目更新" 91 | echo "3) 一键清理 Docker 垃圾" 92 | echo "4) 一键设置 Docker 日志" 93 | echo "----------------------" 94 | echo "0) 返回主菜单 " 95 | echo "----------------------" 96 | } 97 | 98 | # 工具箱 菜单 99 | show_toolbox_menu() { 100 | echo "---------------------" 101 | echo " 工具箱菜单: " 102 | echo "---------------------" 103 | echo "1) [Docker] 1Panel " 104 | echo "2) [Docker] o11 " 105 | echo "3) [Docker] 3X-UI " 106 | echo "4) [Docker] Sub Store" 107 | echo "5) [Docker] LibreTV " 108 | echo "6) [233boy] Sing-box " 109 | echo "7) [Jimmy ] Alice DNS" 110 | echo "---------------------" 111 | echo "0) 返回主菜单 " 112 | echo "---------------------" 113 | } 114 | 115 | # 1Panel 菜单 116 | show_1panel_menu() { 117 | echo "-------------------" 118 | echo " 1Panel 菜单: " 119 | echo "-------------------" 120 | echo "1) 安装 1Panel " 121 | echo "2) 卸载 1Panel " 122 | echo "3) 设置 1Panel " 123 | echo "-------------------" 124 | echo "0) 返回上级菜单 " 125 | echo "-------------------" 126 | } 127 | 128 | # 3X-UI 菜单 129 | show_3x_ui_menu() { 130 | echo "-------------------" 131 | echo " 3X-UI 菜单: " 132 | echo "-------------------" 133 | echo "1) 安装 3X-UI " 134 | echo "2) 更新 3X-UI " 135 | echo "3) 卸载 3X-UI " 136 | echo "-------------------" 137 | echo "0) 返回上级菜单 " 138 | echo "-------------------" 139 | } 140 | 141 | # o11 菜单 142 | show_o11_menu() { 143 | echo "-------------------" 144 | echo " o11 菜单: " 145 | echo "-------------------" 146 | echo "1) 安装 o11 " 147 | echo "2) 卸载 o11 " 148 | echo "-------------------" 149 | echo "0) 返回上级菜单 " 150 | echo "-------------------" 151 | } 152 | 153 | # subs 菜单 154 | show_subs_menu() { 155 | echo "-------------------" 156 | echo " Sub Store 菜单: " 157 | echo "-------------------" 158 | echo "1) 安装 Sub Store " 159 | echo "2) 卸载 Sub Store " 160 | echo "-------------------" 161 | echo "0) 返回上级菜单 " 162 | echo "-------------------" 163 | } 164 | 165 | # libretv 菜单 166 | show_libretv_menu() { 167 | echo "-------------------" 168 | echo " LibreTV 菜单: " 169 | echo "-------------------" 170 | echo "1) 安装 LibreTV " 171 | echo "2) 卸载 LibreTV " 172 | echo "-------------------" 173 | echo "0) 返回上级菜单 " 174 | echo "-------------------" 175 | } 176 | 177 | ############# Pixman ############# 178 | 179 | # 判断 Pixman 容器 180 | judge_Pixman() { 181 | local NETWORK_MODE PORT env_vars 182 | 183 | echo "正在安装 Pixman 项目 作者: @Pixman..." 184 | 185 | if docker ps -a --format '{{.Names}}' | grep -q "^pixman$"; then 186 | local MODE ENV_VARS 187 | 188 | ENV_VARS=$(docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' pixman) 189 | MYTVSUPER_TOKEN=$(echo "$ENV_VARS" | grep -oP 'MYTVSUPER_TOKEN=\K.*') 190 | HAMI_SESSION_ID=$(echo "$ENV_VARS" | grep -oP 'HAMI_SESSION_ID=\K.*') 191 | HAMI_SERIAL_NO=$(echo "$ENV_VARS" | grep -oP 'HAMI_SERIAL_NO=\K.*') 192 | HAMI_SESSION_IP=$(echo "$ENV_VARS" | grep -oP 'HAMI_SESSION_IP=\K.*') 193 | HTTP_PROXY=$(echo "$ENV_VARS" | grep -oP 'HTTP_PROXY=\K.*') 194 | HTTPS_PROXY=$(echo "$ENV_VARS" | grep -oP 'HTTPS_PROXY=\K.*') 195 | 196 | echo -e "${CYAN}检测到已存在的 Pixman 容器,将进行重新安装...${RESET}" 197 | echo -e "当前 ${GREEN}Pixman${RESET} 配置参数:" 198 | [ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN" || echo "MYTVSUPER_TOKEN: 未设置" 199 | [ -n "$HAMI_SESSION_ID" ] && echo "HAMI_SESSION_ID: $HAMI_SESSION_ID" || echo "HAMI_SESSION_ID: 未设置" 200 | [ -n "$HAMI_SERIAL_NO" ] && echo "HAMI_SERIAL_NO: $HAMI_SERIAL_NO" || echo "HAMI_SERIAL_NO: 未设置" 201 | [ -n "$HAMI_SESSION_IP" ] && echo "HAMI_SESSION_IP: $HAMI_SESSION_IP" || echo "HAMI_SESSION_IP: 未设置" 202 | [ -n "$HTTP_PROXY" ] && echo "HTTP_PROXY: $HTTP_PROXY" || echo "HTTP_PROXY: 未设置" 203 | [ -n "$HTTPS_PROXY" ] && echo "HTTPS_PROXY: $HTTPS_PROXY" || echo "HTTPS_PROXY: 未设置" 204 | 205 | 206 | docker rm -f pixman > /dev/null 2>&1 207 | docker rmi -f "$IMAGE_SOURCE" > /dev/null 2>&1 208 | install_Pixman "$MYTVSUPER_TOKEN" "$HAMI_SESSION_ID" "$HAMI_SERIAL_NO" "$HAMI_SESSION_IP" "$HTTP_PROXY" "$HTTPS_PROXY" 209 | else 210 | install_Pixman 211 | fi 212 | } 213 | 214 | # 安装 Pixman 容器 215 | install_Pixman() { 216 | local PORT=$(check_and_allocate_port 5000) 217 | local ARCH IMAGE_SOURCE PROXY_IMAGE_SOURCE 218 | local MYTVSUPER_TOKEN="$1" 219 | local HAMI_SESSION_ID="$2" 220 | local HAMI_SERIAL_NO="$3" 221 | local HAMI_SESSION_IP="$4" 222 | local HTTP_PROXY="$5" 223 | local HTTPS_PROXY="$6" 224 | 225 | echo -e "${CYAN}开始配置 Pixman 参数...${RESET}" 226 | 227 | echo "请选择 Pixman 部署方式(默认: 2):" 228 | echo "1) 使用 host 网络模式 (建议:软路由)" 229 | echo "2) 使用 bridge 网络模式 (建议:VPS)" 230 | read -rp "输入选项 (1 或 2): " option_fourgtv 231 | option_fourgtv=${option_fourgtv:-2} 232 | case "$option_fourgtv" in 233 | 1) NETWORK_MODE="host" ;; 234 | 2) NETWORK_MODE="bridge" ;; 235 | *) 236 | echo -e "${RED}无效选项,使用默认的 bridge 模式。${RESET}" 237 | NETWORK_MODE="bridge" 238 | ;; 239 | esac 240 | 241 | if [[ "$NETWORK_MODE" == "bridge" ]]; then 242 | read -p "请输入 Pixman 容器端口 (当前值: $PORT 输入null清空): " input_port 243 | if [ -n "$input_port" ]; then 244 | [ "$input_port" = "null" ] && PORT="" || PORT=$(check_and_allocate_port "$input_port") 245 | fi 246 | else 247 | PORT="" 248 | fi 249 | 250 | echo "是否需要设置其他环境变量?[y/n](默认:n)" 251 | read -rp "输入选项: " configure_all_vars 252 | configure_all_vars=${configure_all_vars:-n} 253 | if [[ "$configure_all_vars" =~ ^[Yy]$ ]]; then 254 | local env_vars=("MYTVSUPER_TOKEN" "HAMI_SESSION_ID" "HAMI_SERIAL_NO" "HAMI_SESSION_IP" "HTTP_PROXY" "HTTPS_PROXY") 255 | for var in "${env_vars[@]}"; do 256 | local current_value=$(eval echo \$$var) 257 | read -p "请输入 ${var} (当前值: ${current_value:-未设置}, 输入null清空): " input_value 258 | if [ -n "$input_value" ]; then 259 | [ "$input_value" = "null" ] && eval $var="" || eval $var="$input_value" 260 | fi 261 | done 262 | else 263 | echo -e "${YELLOW}已跳过所有环境变量的设置。${RESET}" 264 | fi 265 | 266 | ARCH=$(uname -m) 267 | 268 | if [[ "$ARCH" == "armv7"* ]]; then 269 | IMAGE_SOURCE="pixman/pixman-armv7" 270 | PROXY_IMAGE_SOURCE="$REVERSE_PROXY/pixman-armv7" 271 | else 272 | IMAGE_SOURCE="pixman/pixman" 273 | PROXY_IMAGE_SOURCE="$REVERSE_PROXY/pixman/pixman" 274 | fi 275 | 276 | pull_image "$IMAGE_SOURCE" "$PROXY_IMAGE_SOURCE" 277 | 278 | local docker_command="docker run -d --name pixman --restart always" 279 | 280 | if [[ "$NETWORK_MODE" == "host" ]]; then 281 | docker_command+=" --net=host" 282 | else 283 | docker_command+=" --net=bridge -p $PORT:5000" 284 | fi 285 | 286 | for var in MYTVSUPER_TOKEN HAMI_SESSION_ID HAMI_SERIAL_NO HAMI_SESSION_IP HTTP_PROXY HTTPS_PROXY; do 287 | local value=$(eval echo \$$var) 288 | [ -n "$value" ] && docker_command+=" -e $var=$value" 289 | done 290 | 291 | docker_command+=" $IMAGE_SOURCE" 292 | 293 | echo -e "${CYAN}正在启动 Pixman 容器...${RESET}" 294 | eval "$docker_command" 295 | echo -e "${GREEN}Pixman 容器已成功启动!${RESET}" 296 | 297 | if check_internet_connection; then 298 | install_watchtower "pixman" 299 | else 300 | echo "---------------------------------------------------------" 301 | fi 302 | 303 | live_Pixman "$PORT" 304 | } 305 | 306 | # 生成 Pixman 订阅 307 | live_Pixman() { 308 | local public_ip=$(get_public_ip) 309 | local port="$1" 310 | 311 | echo "◆ 订阅地址:" 312 | echo "■ 四季線上 4GTV : http://$public_ip:$port/4gtv.m3u (部分失效)" 313 | echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u (需填写会员参数)" 314 | echo "■ Hami Video : http://$public_ip:$port/hami.m3u (需填写会员参数)" 315 | echo "---------------------------------------------------------" 316 | echo "--- Pixman 详细使用说明: https://pixman.io/topics/17 ---" 317 | echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---" 318 | echo "---------------------------------------------------------" 319 | 320 | read -p "按 回车键 返回 主菜单 ..." 321 | } 322 | 323 | # 卸载 Pixman 项目 324 | uninstall_Pixman() { 325 | echo "是否确定要卸载 Pixman 项目?[y/n](默认:n)" 326 | read -r -t 10 input 327 | input=${input:-n} 328 | 329 | if [[ "$input" =~ ^[Yy]$ ]]; then 330 | echo -e "${CYAN}正在卸载 Pixman 项目...${RESET}" 331 | docker stop pixman > /dev/null 2>&1 332 | docker rm -f pixman > /dev/null 2>&1 333 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'pixman/pixman' | xargs -r docker rmi > /dev/null 2>&1 334 | uninstall_watchtower "pixman" 335 | echo -e "${RED}Pixman 项目 已成功卸载。${RESET}" 336 | else 337 | echo -e "${GREEN}取消卸载操作。${RESET}" 338 | fi 339 | } 340 | 341 | ############# Fourgtv ############# 342 | 343 | # 安装 Fourgtv 344 | install_Fourgtv() { 345 | local public_ip 346 | local ENV_VARS 347 | local public_ip=$(get_public_ip) 348 | local port=$(check_and_allocate_port 8000) 349 | 350 | IMAGE_SOURCE="ru2025/fourgtv:latest" 351 | PROXY_IMAGE_SOURCE="$REVERSE_PROXY/ru2025/fourgtv:latest" 352 | echo "正在安装 Fourgtv 项目 作者: @刘墉..." 353 | 354 | if docker ps -a --format '{{.Names}}' | grep -q "^fourgtv$"; then 355 | echo -e "${CYAN}检测到已存在的 Fourgtv 容器,将进行重新安装...${RESET}" 356 | ENV_VARS=$(docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' fourgtv) 357 | NOWSESSIONID=$(echo "$ENV_VARS" | grep -oP 'NOWSESSIONID=\K.*') 358 | NOWUSERAGENT=$(echo "$ENV_VARS" | grep -oP 'NOWUSERAGENT=\K.*') 359 | MYTVSUPER_TOKEN=$(echo "$ENV_VARS" | grep -oP 'MYTVSUPER_TOKEN=\K.*') 360 | 361 | echo -e "当前 ${GREEN}Fourgtv${RESET} 配置参数:" 362 | [ -n "$NOWSESSIONID" ] && echo "NOWSESSIONID: $NOWSESSIONID" || echo "NOWSESSIONID: 未设置" 363 | [ -n "$NOWUSERAGENT" ] && echo "NOWUSERAGENT: $NOWUSERAGENT" || echo "NOWUSERAGENT: 未设置" 364 | [ -n "$MYTVSUPER_TOKEN" ] && echo "MYTVSUPER_TOKEN: $MYTVSUPER_TOKEN" || echo "MYTVSUPER_TOKEN: 未设置" 365 | 366 | docker stop fourgtv > /dev/null 2>&1 367 | docker rm -f fourgtv > /dev/null 2>&1 368 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ru2025/fourgtv:latest' | xargs -r docker rmi > /dev/null 2>&1 369 | fi 370 | 371 | pull_image "$IMAGE_SOURCE" "$PROXY_IMAGE_SOURCE" 372 | 373 | echo "请输入 Fourgtv 配置参数:" 374 | echo "当前 Fourgtv 使用的端口是 $port,是否需要修改?[y/n](默认:n)" 375 | read -r -t 10 input_port 376 | input_port=${input_port:-n} 377 | 378 | if [[ "$input_port" =~ ^[Yy]$ ]]; then 379 | read -rp "请输入新的端口号: " port 380 | fi 381 | 382 | echo "是否需要修改其他环境变量?[y/n](默认:n)" 383 | read -r -t 10 input_vars 384 | input_vars=${input_vars:-n} 385 | 386 | if [[ "$input_vars" =~ ^[Yy]$ ]]; then 387 | read -rp "请输入 NOWSESSIONID: " NOWSESSIONID 388 | read -rp "请输入 NOWUSERAGENT: " NOWUSERAGENT 389 | read -rp "请输入 MYTVSUPER_TOKEN: " MYTVSUPER_TOKEN 390 | fi 391 | 392 | echo "请选择 Fourgtv 部署方式(默认: 2):" 393 | echo "1) 使用 host 网络模式 (建议:软路由)" 394 | echo "2) 使用 bridge 网络模式 (建议:VPS)" 395 | read -rp "输入选项 (1 或 2): " option_fourgtv 396 | option_fourgtv=${option_fourgtv:-2} 397 | 398 | case $option_fourgtv in 399 | 1|host) 400 | echo "正在使用 host 网络模式安装 Fourgtv..." 401 | docker run -d --restart always --net=host -p $port:8000 --name fourgtv \ 402 | ${NOWSESSIONID:+-e NOWSESSIONID=$NOWSESSIONID} \ 403 | ${NOWUSERAGENT:+-e NOWUSERAGENT=$NOWUSERAGENT} \ 404 | ${MYTVSUPER_TOKEN:+-e MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN} \ 405 | $IMAGE_SOURCE 406 | ;; 407 | 408 | 2|bridge) 409 | echo "正在使用 bridge 网络模式安装 Fourgtv..." 410 | docker run -d --restart always --net=bridge -p $port:8000 --name fourgtv \ 411 | ${NOWSESSIONID:+-e NOWSESSIONID=$NOWSESSIONID} \ 412 | ${NOWUSERAGENT:+-e NOWUSERAGENT=$NOWUSERAGENT} \ 413 | ${MYTVSUPER_TOKEN:+-e MYTVSUPER_TOKEN=$MYTVSUPER_TOKEN} \ 414 | $IMAGE_SOURCE 415 | ;; 416 | esac 417 | 418 | echo -e "${GREEN}Fourgtv 安装完成。${RESET}" 419 | 420 | if check_internet_connection; then 421 | install_watchtower "fourgtv" 422 | else 423 | echo "---------------------------------------------------------" 424 | fi 425 | 426 | live_Fourgtv "$public_ip" "$port" 427 | } 428 | 429 | # 生成 Fourgtv 订阅 430 | live_Fourgtv() { 431 | local public_ip="$1" 432 | local port="$2" 433 | 434 | echo "◆ 订阅地址:" 435 | echo "■ iTV : http://$public_ip:$port/itv.m3u (需消耗服务器流量)" 436 | echo "■ Beesport : http://$public_ip:$port/beesport.m3u (部分地区可直连)" 437 | echo "■ 4GTV : http://$public_ip:$port/4gtv.m3u (部分节目需要解锁台湾IP)" 438 | echo "■ MytvSuper : http://$public_ip:$port/mytvsuper.m3u(需填写会员参数)" 439 | echo "■ Now : http://$public_ip:$port/now.m3u (收费频道,需填写会员参数、原生IP)" 440 | echo "■ Now : http://$public_ip:$port/now-free.m3u (免费频道,需填写会员参数、原生IP)" 441 | echo "■ YouTube : http://$public_ip:$port/youtube/{房间号} (支持列表 list/{列表号} )" 442 | echo "---------------------------------------------------------" 443 | echo "--- Fourgtv 详细使用说明: https://t.me/livednowgroup ---" 444 | echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---" 445 | echo "---------------------------------------------------------" 446 | 447 | read -p "按 回车键 返回 主菜单 ..." 448 | } 449 | 450 | # 卸载 Fourgtv 451 | uninstall_Fourgtv() { 452 | echo "是否确定要卸载 Fourgtv 项目?[y/n](默认:n)" 453 | read -r -t 10 input 454 | input=${input:-n} 455 | 456 | if [[ "$input" =~ ^[Yy]$ ]]; then 457 | echo -e "${CYAN}正在卸载 Fourgtv 项目...${RESET}" 458 | docker stop fourgtv > /dev/null 2>&1 459 | docker rm -f fourgtv > /dev/null 2>&1 460 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'ru2025/fourgtv:latest' | xargs -r docker rmi > /dev/null 2>&1 461 | uninstall_watchtower "fourgtv" 462 | echo -e "${RED}Fourgtv 项目 已成功卸载。${RESET}" 463 | else 464 | echo -e "${GREEN}取消卸载操作。${RESET}" 465 | fi 466 | } 467 | 468 | ############# Doubebly ############# 469 | 470 | # 安装 Doubebly 471 | install_Doubebly() { 472 | local public_ip=$(get_public_ip) 473 | local port_ofiii=$(check_and_allocate_port 50002) 474 | echo -e "${YELLOW}==================================================${RESET}" 475 | echo -e "${YELLOW}提示:如果你使用的是软路由,请移步 Telegram 查看安装教程${RESET}" 476 | echo -e "${CYAN}👉 https://t.me/doubebly003${RESET}" 477 | echo -e "${YELLOW}==================================================${RESET}" 478 | read -rp "是否继续安装 Doubebly?[y/n](默认:n) " confirm_install 479 | confirm_install=${confirm_install:-n} 480 | 481 | if [[ ! "$confirm_install" =~ ^[Yy]$ ]]; then 482 | echo -e "${RED}安装已取消。${RESET}" 483 | return 484 | fi 485 | 486 | echo "请输入订阅使用的 Token(默认: Doubebly):" 487 | read -rp "Token: " my_token 488 | my_token=${my_token:-Doubebly} 489 | 490 | echo "请输入 DNS 解锁 IP(例如 Alice 提供的):" 491 | read -rp "DNS IP(默认: 8.8.8.8): " custom_dns 492 | custom_dns=${custom_dns:-8.8.8.8} 493 | 494 | if docker ps -a --format '{{.Names}}' | grep -q "^doube-ofiii$"; then 495 | echo -e "${CYAN}检测到已存在的 doube-ofiii 容器,正在重新部署...${RESET}" 496 | docker stop doube-ofiii >/dev/null 2>&1 497 | docker rm doube-ofiii >/dev/null 2>&1 498 | fi 499 | 500 | docker pull doubebly/doube-ofiii:1.1.3 501 | docker run -d --name=doube-ofiii \ 502 | -p ${port_ofiii}:5000 \ 503 | -e MY_OFIII_TOKEN="${my_token}" \ 504 | --restart=always \ 505 | --dns=${custom_dns} \ 506 | doubebly/doube-ofiii:1.1.3 507 | 508 | echo -e "${GREEN}doube-ofiii 安装完成。${RESET}" 509 | if check_internet_connection; then 510 | install_watchtower "doube-ofiii" 511 | else 512 | echo "---------------------------------------------------------" 513 | fi 514 | 515 | echo "◆ 订阅地址:" 516 | echo "◆ 直播TXT订阅地址: http://${public_ip}:${port_ofiii}/Sub.txt" 517 | echo "◆ 直播M3U订阅地址: http://${public_ip}:${port_ofiii}/Sub.m3u" 518 | echo "◆ 点播M3U订阅地址: http://${public_ip}:${port_ofiii}/Sub.vod.m3u?pids=ofiii75" 519 | echo 520 | echo "📌 加参数方式示例:" 521 | echo "▶ http://${public_ip}:${port_ofiii}/Sub.m3u?token=${my_token}&sd=720&proxy=true" 522 | echo "▶ http://${public_ip}:${port_ofiii}/Sub.vod.m3u?token=${my_token}&sd=720&proxy=true&pids=ofiii75,ofiii76" 523 | echo "---------------------------------------------------------" 524 | echo "--- Doubebly 详细使用说明: https://t.me/doubebly003 ----" 525 | echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---" 526 | echo "---------------------------------------------------------" 527 | 528 | read -p "按 回车键 返回主菜单 ..." 529 | } 530 | 531 | # 卸载 Doubebly 532 | uninstall_Doubebly() { 533 | echo "是否卸载 doube-ofiii 容器?" 534 | echo "1) 卸载 doube-ofiii" 535 | echo "2) 取消操作" 536 | 537 | read -rp "输入选项 (1 或 2): " option 538 | option=${option:-1} 539 | 540 | if [[ "$option" != "1" ]]; then 541 | echo "已取消卸载操作。" 542 | return 543 | fi 544 | 545 | if docker ps -a --format '{{.Names}}' | grep -q "^doube-ofiii$"; then 546 | echo -e "${CYAN}正在卸载 doube-ofiii...${RESET}" 547 | docker stop doube-ofiii > /dev/null 2>&1 548 | docker rm -f doube-ofiii > /dev/null 2>&1 549 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'doubebly/doube-ofiii' | xargs -r docker rmi > /dev/null 2>&1 550 | uninstall_watchtower "doube-ofiii" 551 | echo -e "${RED}doube-ofiii 已成功卸载。${RESET}" 552 | else 553 | echo -e "${YELLOW}未找到 doube-ofiii 容器,跳过卸载操作。${RESET}" 554 | fi 555 | } 556 | 557 | ############# watchtower ############# 558 | 559 | #一键 watchtower 更新 560 | update_watchtower() { 561 | echo "===== 目前运行中的容器 =====" 562 | local running_containers=$(docker ps --format "{{.Names}}") 563 | 564 | if [ -n "$running_containers" ]; then 565 | echo "可选容器列表:" 566 | local index=1 567 | all_container_map=() 568 | 569 | while IFS= read -r container; do 570 | all_container_map[$index]=$container 571 | echo "$index. $container" 572 | ((index++)) 573 | done <<< "$running_containers" 574 | 575 | echo "" 576 | echo "容器总数: $((index-1))" 577 | 578 | read -p "请选择要更新的容器编号: " container_choice 579 | 580 | if [[ $container_choice -ge 1 && $container_choice -lt $index ]]; then 581 | local selected_container=${all_container_map[$container_choice]} 582 | echo -e "${CYAN}正在检测容器: $selected_container${RESET}" 583 | 584 | local watchtower_output 585 | watchtower_output=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower "$selected_container" --run-once -c 2>&1) 586 | 587 | local failed scanned updated 588 | if [[ $watchtower_output =~ Failed=([0-9]+) ]]; then 589 | failed="${BASH_REMATCH[1]}" 590 | fi 591 | if [[ $watchtower_output =~ Scanned=([0-9]+) ]]; then 592 | scanned="${BASH_REMATCH[1]}" 593 | fi 594 | if [[ $watchtower_output =~ Updated=([0-9]+) ]]; then 595 | updated="${BASH_REMATCH[1]}" 596 | fi 597 | 598 | if [[ $failed -eq 1 && $scanned -eq 1 && $updated -eq 0 ]]; then 599 | echo -e "${RED}检测失败。${RESET}" 600 | elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 0 ]]; then 601 | echo -e "${YELLOW}无需更新。${RESET}" 602 | elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 1 ]]; then 603 | echo -e "${GREEN}更新成功!${RESET}" 604 | else 605 | echo "未知的检测结果。" 606 | fi 607 | else 608 | echo "无效的选择。" 609 | fi 610 | else 611 | echo "没有运行中的容器。" 612 | fi 613 | } 614 | 615 | # 管理 Watchtower 监控容器 616 | manage_watchtower() { 617 | declare -A all_container_map 618 | declare -A container_map 619 | 620 | show_monitored_containers() { 621 | existing_args=$(docker inspect --format '{{.Args}}' watchtower) 622 | monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*") 623 | 624 | echo "===== Watchtower 当前监控的容器 =====" 625 | if [ -n "$monitored_containers" ]; then 626 | echo "监控的容器列表:" 627 | local index=1 628 | container_map=() 629 | 630 | for container in $monitored_containers; do 631 | container_map[$index]=$container 632 | if docker ps --format "{{.Names}}" | grep -q "^$container$"; then 633 | echo -e "$index. $container (运行中)" 634 | else 635 | echo -e "$index. $container (未运行)" 636 | fi 637 | ((index++)) 638 | done 639 | echo "" 640 | echo "容器总数: $((index-1))" 641 | else 642 | echo "当前没有监控任何容器。" 643 | return 1 644 | fi 645 | } 646 | 647 | show_all_containers() { 648 | echo "===== 目前运行中的容器 =====" 649 | local running_containers=$(docker ps --format "{{.Names}}" | grep -v "^watchtower$") 650 | if [ -n "$running_containers" ]; then 651 | echo "可选容器列表:" 652 | local index=1 653 | all_container_map=() 654 | 655 | while IFS= read -r container; do 656 | all_container_map[$index]=$container 657 | echo "$index. $container" 658 | ((index++)) 659 | done <<< "$running_containers" 660 | echo "" 661 | echo "容器总数: $((index-1))" 662 | return 0 663 | else 664 | echo "当前没有运行中的容器。" 665 | return 1 666 | fi 667 | } 668 | echo "Watchtower - 自动更新 Docker 镜像与容器" 669 | echo -e "请选择操作类型:" 670 | echo "1. 添加监控容器" 671 | echo "2. 删除监控容器" 672 | read -rp "请输入选项 [1/2]:" action 673 | 674 | case "$action" in 675 | 1) # 添加容器 676 | if show_all_containers; then 677 | read -rp "请输入要添加到监控的容器编号:" number 678 | if [[ $number =~ ^[0-9]+$ ]] && [ -n "${all_container_map[$number]}" ]; then 679 | name=${all_container_map[$number]} 680 | install_watchtower "$name" 681 | else 682 | echo "编号无效,请重试。" 683 | fi 684 | fi 685 | ;; 686 | 2) # 删除容器 687 | if show_monitored_containers; then 688 | read -rp "请输入要删除的监控容器编号:" number 689 | if [[ $number =~ ^[0-9]+$ ]] && [ -n "${container_map[$number]}" ]; then 690 | name=${container_map[$number]} 691 | uninstall_watchtower "$name" 692 | else 693 | echo "编号无效,请重试。" 694 | fi 695 | fi 696 | ;; 697 | *) 698 | echo "无效选项,请选择 1 或 2。" 699 | ;; 700 | esac 701 | } 702 | 703 | # 增加 watchtower 监控 704 | install_watchtower() { 705 | local name="$1" 706 | 707 | if [ -z "$name" ]; then 708 | echo -e "${RED}错误: 未指定要监控的容器名称${RESET}" 709 | return 1 710 | fi 711 | 712 | local monitored_containers="" 713 | 714 | if docker ps -q -f name=watchtower > /dev/null 2>&1; then 715 | existing_args=$(docker inspect --format '{{.Args}}' watchtower) 716 | monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*") 717 | 718 | if echo "$monitored_containers" | grep -qw "$name"; then 719 | echo "---------------------------------------------------------" 720 | echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}" 721 | echo "---------------------------------------------------------" 722 | return 0 723 | fi 724 | 725 | monitored_containers="${monitored_containers:+$monitored_containers }$name" 726 | 727 | docker stop watchtower > /dev/null 2>&1 728 | docker rm watchtower > /dev/null 2>&1 729 | else 730 | monitored_containers="$name" 731 | fi 732 | 733 | echo "正在安装或配置 Watchtower 并监控 $name 镜像更新..." 734 | 735 | IMAGE_SOURCE="containrrr/watchtower" 736 | PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower" 737 | 738 | if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then 739 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 740 | if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then 741 | echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}" 742 | return 1 743 | fi 744 | IMAGE_SOURCE="$PROXY_IMAGE_SOURCE" 745 | fi 746 | 747 | if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then 748 | echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}" 749 | return 1 750 | fi 751 | 752 | echo "---------------------------------------------------------" 753 | echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}" 754 | echo "---------------------------------------------------------" 755 | return 0 756 | } 757 | 758 | # 删除 Watchtower 监控 759 | uninstall_watchtower() { 760 | local name="$1" 761 | 762 | if docker ps -q -f name=watchtower > /dev/null 2>&1; then 763 | 764 | existing_args=$(docker inspect --format '{{.Args}}' watchtower) 765 | monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*") 766 | 767 | if echo "$monitored_containers" | grep -qw "$name"; then 768 | # 移除指定容器名称 769 | monitored_containers=$(echo "$monitored_containers" | sed "s/\b$name\b//g" | xargs) 770 | 771 | if [ -z "$monitored_containers" ]; then 772 | echo "没有其他监控的容器,正在停止并删除 Watchtower..." 773 | docker stop watchtower > /dev/null 2>&1 774 | docker rm watchtower > /dev/null 2>&1 775 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'containrrr/watchtower' | xargs -r docker rmi > /dev/null 2>&1 776 | echo "Watchtower 已成功卸载。" 777 | else 778 | docker stop watchtower > /dev/null 2>&1 779 | docker rm watchtower > /dev/null 2>&1 780 | 781 | IMAGE_SOURCE="containrrr/watchtower" 782 | PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower" 783 | 784 | if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then 785 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 786 | if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then 787 | echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}" 788 | return 1 789 | fi 790 | IMAGE_SOURCE="$PROXY_IMAGE_SOURCE" 791 | fi 792 | 793 | if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then 794 | echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}" 795 | return 1 796 | fi 797 | echo -e "${GREEN}$name${RESET} 容器已从监控中删除。" 798 | fi 799 | else 800 | echo "容器 $name 未被 Watchtower 监控。" 801 | fi 802 | else 803 | echo "Watchtower 当前未安装。" 804 | fi 805 | } 806 | 807 | ############# 3X-UI ############# 808 | 809 | # 安装 3X-UI 810 | install_3x_ui() { 811 | local public_ip=$(get_public_ip) 812 | 813 | echo "请选择部署方式:" 814 | echo "1) 使用 host 网络模式 (添加节点方便)" 815 | echo "2) 使用 bridge 网络模式 (添加节点,需映射端口)" 816 | echo "3) 使用 sh 脚本 直接安装 (推荐)" 817 | read -rp "输入选项 (1-3): " option 818 | 819 | case $option in 820 | 1) 821 | echo "正在使用 host 网络模式安装 3X-UI 面板..." 822 | docker run -d \ 823 | -e XRAY_VMESS_AEAD_FORCED=false \ 824 | -v "$PWD/db/:/etc/x-ui/" \ 825 | -v "$PWD/cert/:/root/cert/" \ 826 | --network=host \ 827 | --restart=unless-stopped \ 828 | --name 3x-ui \ 829 | ghcr.io/mhsanaei/3x-ui:latest 830 | 831 | echo -e "${GREEN}3X-UI 安装完成。${RESET}" 832 | echo "访问信息:" 833 | echo "URL: http://$public_ip:2053" 834 | ;; 835 | 836 | 2) 837 | echo "正在使用 bridge 网络模式安装 3X-UI 面板..." 838 | local default_port=17878 839 | 840 | read -rp "请输入要映射的端口 (默认: $default_port): " port 841 | port=${port:-$default_port} 842 | 843 | if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1024 ] || [ "$port" -gt 65535 ]; then 844 | echo "无效端口。请使用 1024 到 65535 之间的数字。" 845 | return 1 846 | fi 847 | 848 | local node_port1=$(generate_random_port) 849 | local node_port2=$(generate_random_port) 850 | local node_port3=$(generate_random_port) 851 | 852 | docker run -d \ 853 | -e XRAY_VMESS_AEAD_FORCED=false \ 854 | -p $port:2053 \ 855 | -p $node_port1:$node_port1 \ 856 | -p $node_port2:$node_port2 \ 857 | -v "$PWD/db/:/etc/x-ui/" \ 858 | -v "$PWD/cert/:/root/cert/" \ 859 | --restart=unless-stopped \ 860 | --name 3x-ui \ 861 | ghcr.io/mhsanaei/3x-ui:latest 862 | 863 | echo -e "${GREEN}3X-UI 安装完成。${RESET}" 864 | echo "访问信息:" 865 | echo "URL: http://$public_ip:$port" 866 | echo "随机生成两个节点端口,后续自行添加。" 867 | echo "节点端口: $node_port1" 868 | echo "节点端口: $node_port2" 869 | echo "节点端口: $node_port3" 870 | ;; 871 | 3) 872 | bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) 873 | 874 | echo -e "${GREEN}3X-UI 安装完成。${RESET}" 875 | echo "访问信息:" 876 | echo "输入 x-ui 进行修改设置" 877 | echo "URL: http://$public_ip:2053" 878 | ;; 879 | *) echo "无效的选项,请输入 0-3。" ;; 880 | esac 881 | 882 | echo "------------------" 883 | echo "默认用户名: admin" 884 | echo "默认密码: admin" 885 | echo "------------------" 886 | echo "请立即更改默认密码!" 887 | echo "------------------" 888 | echo "GIthub: https://github.com/MHSanaei/3x-ui" 889 | echo "------------------" 890 | read -p "按 回车键 返回 主菜单 ..." 891 | } 892 | 893 | # 更新 3X-UI 894 | update_3x_ui() { 895 | echo "正在更新 3X-UI 面板至最新版本..." 896 | if docker ps -a | grep -q 3x-ui; then 897 | docker stop 3x-ui > /dev/null 2>&1 898 | docker rm 3x-ui > /dev/null 2>&1 899 | install_3x_ui 900 | echo "3X-UI 面板已更新至最新版本。" 901 | else 902 | echo "错误:未找到 3x-ui 容器。请先安装 3X-UI。" 903 | return 1 904 | fi 905 | } 906 | 907 | # 卸载 3X-UI 908 | uninstall_3x_ui() { 909 | read -p "您确定要卸载 3X-UI 面板吗?[y/n](默认:n)" confirm 910 | if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then 911 | echo "卸载操作已取消。" 912 | return 913 | fi 914 | docker stop 3x-ui > /dev/null 2>&1 915 | docker rm 3x-ui > /dev/null 2>&1 916 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'mhsanaei/3x-ui' | xargs -r docker rmi > /dev/null 2>&1 917 | [ -d "$PWD/db" ] && rm -rf "$PWD/db" 918 | echo -e "${GREEN}3X-UI 卸载完成。${RESET}" 919 | } 920 | 921 | ############# o11 ############# 922 | 923 | # 安装 o11 924 | install_o11() { 925 | if docker ps -a --format '{{.Names}}' | grep -q 'o11'; then 926 | echo -e "${RED}o11 已经安装,请先卸载再重新安装。${RESET}" 927 | return 1 928 | fi 929 | ARCH=$(uname -m) 930 | if [[ "$ARCH" != "arm"* && "$ARCH" != "aarch64" ]]; then 931 | echo "系统架构: $ARCH,支持安装 o11。" 932 | echo "正在安装 o11 面板..." 933 | local port=$(check_and_allocate_port 1234) 934 | local public_ip=$(get_public_ip) 935 | 936 | docker run -d --restart=always -p $port:1234 --name o11 wechatofficial/o11:latest 937 | 938 | echo -e "${GREEN}o11 安装完成。${RESET}" 939 | echo "访问信息:" 940 | echo "URL: http://$public_ip:$port" 941 | echo "小白教程: https://pixman.io/topics/118" 942 | echo "请根据 o11 的文档进行配置和管理。" 943 | read -p "按 回车键 返回 主菜单 ..." 944 | else 945 | echo "不支持的系统架构: $ARCH,o11 安装失败..." 946 | return 947 | fi 948 | } 949 | 950 | # 卸载 o11 951 | uninstall_o11() { 952 | local public_ip=$(get_public_ip) 953 | 954 | read -p "您确定要卸载 o11 面板吗?[y/n](默认:n)" confirm 955 | if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then 956 | echo "卸载操作已取消。" 957 | return 958 | fi 959 | docker stop o11 > /dev/null 2>&1 960 | docker rm o11 > /dev/null 2>&1 961 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'wechatofficial/o11' | xargs -r docker rmi > /dev/null 2>&1 962 | echo -e "${GREEN}o11 卸载完成。${RESET}" 963 | } 964 | 965 | ############# 1Panel ############# 966 | 967 | # 安装 1Panel 968 | install_1panel() { 969 | echo "正在安装 1Panel 面板..." 970 | curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh 971 | echo "GIthub: https://github.com/1Panel-dev/1Panel" 972 | echo -e "${GREEN}1Panel 安装完成。${RESET}" 973 | } 974 | 975 | # 设置 1Panel 976 | set_1panel() { 977 | 1pctl user-info 978 | 1pctl update password 979 | } 980 | 981 | # 卸载 1Panel 982 | uninstall_1panel() { 983 | read -p "您确定要卸载 1Panel 吗?[y/n](默认:n)" confirm 984 | if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then 985 | echo "卸载操作已取消。" 986 | return 987 | fi 988 | if command -v 1pctl > /dev/null 2>&1; then 989 | 1pctl uninstall 990 | fi 991 | echo -e "${GREEN}1Panel 卸载完成。${RESET}" 992 | } 993 | 994 | ############# Sub Store ############# 995 | 996 | # 安装 Sub Store 997 | install_sub_store() { 998 | local public_ip=$(get_public_ip) 999 | 1000 | if docker ps -a --format '{{.Names}}' | grep -q 'sub-store'; then 1001 | echo -e "${RED}Sub Store 已经安装,请先卸载再重新安装。${RESET}" 1002 | return 1 1003 | fi 1004 | 1005 | echo "Sub Store 节点订阅管理工具,是否决定安装? (y/n)" 1006 | read -r confirmation 1007 | if [[ ! "$confirmation" =~ ^[Yy]$ ]]; then 1008 | echo "安装已取消。" 1009 | return 0 1010 | fi 1011 | 1012 | echo "开始安装 Sub Store..." 1013 | local IMAGE_SOURCE="xream/sub-store" 1014 | local PROXY_IMAGE_SOURCE="$REVERSE_PROXY/xream/sub-store" 1015 | local frontend_backend_key=$(openssl rand -base64 15 | tr -dc 'a-zA-Z0-9' | head -c 20) 1016 | 1017 | echo "拉取 Sub Store 镜像中..." 1018 | if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then 1019 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 1020 | if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then 1021 | echo -e "${RED}安装 Sub Store 失败,请检查反向代理或网络连接。${RESET}" 1022 | exit 1 1023 | fi 1024 | IMAGE_SOURCE="$PROXY_IMAGE_SOURCE" 1025 | fi 1026 | 1027 | echo "正在启动 Sub Store 容器..." 1028 | 1029 | if ! docker run -d --restart=always -e "SUB_STORE_CRON=50 23 * * *" -e "SUB_STORE_FRONTEND_BACKEND_PATH=/$frontend_backend_key" -p 3001:3001 -v /etc/sub-store:/opt/app/data --name sub-store "$IMAGE_SOURCE"; then 1030 | echo "错误: 容器启动失败" >&2 1031 | return 1 1032 | fi 1033 | 1034 | echo "Sub Store 安装成功!" 1035 | echo "访问地址: http://${public_ip}:3001?api=http://${public_ip}:3001/$frontend_backend_key" 1036 | } 1037 | 1038 | # 卸载 Sub Store 1039 | uninstall_sub_store() { 1040 | read -p "是否卸载 Sub Store?[y/n](默认:n)" confirm 1041 | if [[ $confirm == "y" || $confirm == "Y" ]]; then 1042 | echo "正在卸载 Sub Store..." 1043 | docker stop sub-store > /dev/null 2>&1 1044 | docker rm -f sub-store > /dev/null 2>&1 1045 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'xream/sub-store' | xargs -r docker rmi > /dev/null 2>&1 1046 | echo -e "${RED}Sub Store 卸载完成。${RESET}" 1047 | else 1048 | echo -e "${GREEN}取消卸载操作。${RESET}" 1049 | fi 1050 | } 1051 | 1052 | ############# LibreTV ############# 1053 | 1054 | install_libretv() { 1055 | local public_ip=$(get_public_ip) 1056 | 1057 | if docker ps -a --format '{{.Names}}' | grep -q 'libretv'; then 1058 | echo -e "${RED}LibreTV 已经安装,请先卸载再重新安装。${RESET}" 1059 | return 1 1060 | fi 1061 | 1062 | echo "LibreTV 视频搜索引擎,是否决定安装? (y/n)" 1063 | read -r confirmation 1064 | if [[ ! "$confirmation" =~ ^[Yy]$ ]]; then 1065 | echo "安装已取消。" 1066 | return 0 1067 | fi 1068 | 1069 | echo "请输入访问密码(可留空,默认无密码):" 1070 | read -r password 1071 | 1072 | echo "开始安装 LibreTV..." 1073 | local IMAGE_SOURCE="bestzwei/libretv:latest" 1074 | local PROXY_IMAGE_SOURCE="$REVERSE_PROXY/bestzwei/libretv:latest" 1075 | 1076 | echo "拉取 LibreTV 镜像中..." 1077 | if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then 1078 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 1079 | if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then 1080 | echo -e "${RED}安装 LibreTV 失败,请检查反向代理或网络连接。${RESET}" 1081 | return 1 1082 | fi 1083 | IMAGE_SOURCE="$PROXY_IMAGE_SOURCE" 1084 | fi 1085 | 1086 | echo "正在启动 LibreTV 容器..." 1087 | 1088 | if ! docker run -d --name libretv --restart=always -p 8899:80 -e PASSWORD="${password}" "$IMAGE_SOURCE"; then 1089 | echo "错误: 容器启动失败" >&2 1090 | return 1 1091 | fi 1092 | echo "---------------------------------------------------------" 1093 | echo "LibreTV 安装成功!" 1094 | echo "访问地址: http://${public_ip}:8899" 1095 | if [[ -n "$password" ]]; then 1096 | echo "登录密码: ${password}" 1097 | else 1098 | echo "当前无访问密码保护。" 1099 | fi 1100 | echo "---------------------------------------------------------" 1101 | echo " LibreTV 详细使用说明: https://github.com/LibreSpark/LibreTV" 1102 | echo "--- NoobIPTV.sh 脚本日志: https://pixman.io/topics/142 ---" 1103 | echo "---------------------------------------------------------" 1104 | } 1105 | 1106 | uninstall_libretv() { 1107 | read -p "是否卸载 LibreTV?[y/n](默认:n)" confirm 1108 | if [[ $confirm == "y" || $confirm == "Y" ]]; then 1109 | echo "正在卸载 LibreTV..." 1110 | docker stop libretv > /dev/null 2>&1 1111 | docker rm -f libretv > /dev/null 2>&1 1112 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'bestzwei/libretv' | xargs -r docker rmi > /dev/null 2>&1 1113 | echo -e "${RED}LibreTV 卸载完成。${RESET}" 1114 | else 1115 | echo -e "${GREEN}取消卸载操作。${RESET}" 1116 | fi 1117 | } 1118 | 1119 | ############# sing-box ############# 1120 | 1121 | # 一键搭建节点 1122 | install_233boy() { 1123 | echo "欢迎使用一键搭建节点脚本!" 1124 | echo "此脚本将从 233boy 仓库安装 sing-box,请确保您信任此来源。" 1125 | read -p "继续安装?(y/n): " confirm 1126 | if [[ $confirm == "y" || $confirm == "Y" ]]; then 1127 | echo "正在下载并运行安装脚本..." 1128 | bash <(wget -qO- https://github.com/233boy/sing-box/raw/main/install.sh) 1129 | else 1130 | echo "安装已取消。" 1131 | fi 1132 | } 1133 | 1134 | ############# Alice 解锁 ############# 1135 | 1136 | # 一键搭建 Alice DNS解锁 1137 | install_Jimmy() { 1138 | echo "欢迎使用一键 Alice DNS解锁 脚本!" 1139 | echo "此脚本将从 Jimmyzxk 仓库安装 Alice 解锁,请确保您信任此来源。" 1140 | read -p "继续安装?(y/n): " confirm 1141 | if [[ $confirm == "y" || $confirm == "Y" ]]; then 1142 | echo "正在下载并运行安装脚本..." 1143 | wget https://raw.githubusercontent.com/Jimmyzxk/DNS-Alice-Unlock/refs/heads/main/dns-unlock.sh && bash dns-unlock.sh 1144 | echo "详细使用说明: https://www.nodeseek.com/post-202393-1" 1145 | else 1146 | echo "安装已取消。" 1147 | fi 1148 | } 1149 | 1150 | ############# 辅助函数 ############# 1151 | 1152 | # 拉取镜像 1153 | pull_image() { 1154 | local image=$1 1155 | local proxy_image=$2 1156 | if ! docker pull "$image" > /dev/null 2>&1; then 1157 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 1158 | if ! docker pull "$proxy_image" > /dev/null 2>&1; then 1159 | echo -e "${RED}安装失败,请检查反向代理或网络连接。${RESET}" 1160 | exit 1 1161 | fi 1162 | docker tag "$proxy_image" "$image" 1163 | docker rmi "$proxy_image" 1164 | fi 1165 | } 1166 | 1167 | # 检查 访问境外 是否受限 1168 | check_internet_connection() { 1169 | if curl -s --connect-timeout 5 --max-time 10 --retry 2 google.com > /dev/null 2>&1; then 1170 | return 0 # 无受限 1171 | else 1172 | return 1 # 受限 1173 | fi 1174 | } 1175 | 1176 | # 获取公网 IP / 失败返回 {路由IP} 1177 | get_public_ip() { 1178 | # IPv4 1179 | ip=$(curl -s --max-time 3 https://ipv4.icanhazip.com | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}') 1180 | if [[ -n "$ip" ]]; then 1181 | echo "$ip" 1182 | return 0 1183 | fi 1184 | 1185 | # IPv6 1186 | ip=$(curl -s --max-time 3 https://ipv6.icanhazip.com | grep -oE '([0-9a-fA-F:]+:+)+[0-9a-fA-F]+') 1187 | if [[ -n "$ip" ]]; then 1188 | echo "$ip" 1189 | return 0 1190 | fi 1191 | 1192 | echo "{路由IP}" 1193 | return 1 1194 | } 1195 | 1196 | # 检查 IP 归属地 1197 | check_if_in_china() { 1198 | local ip="$1" 1199 | local response 1200 | 1201 | response=$(curl -s --max-time 3 "http://ip-api.com/json/$ip") 1202 | if echo "$response" | grep -qiE '"country"[[:space:]]*:[[:space:]]*"?(CN|China)"?|中国'; then 1203 | return 0 1204 | fi 1205 | return 1 1206 | } 1207 | 1208 | # 检查 Docker 是否安装 1209 | check_docker() { 1210 | if ! command -v docker &> /dev/null; then 1211 | echo -e "${CYAN}Docker 未安装,正在进行安装...${RESET}" 1212 | install_docker 1213 | else 1214 | echo -e "${GREEN}Docker 已安装。${RESET}" 1215 | fi 1216 | } 1217 | 1218 | # 选择 Docker 版本 1219 | install_docker() { 1220 | OS=$(lsb_release -is 2>/dev/null || cat /etc/os-release | grep '^ID=' | cut -d= -f2 | tr -d '"') 1221 | ARCH=$(uname -m) 1222 | 1223 | case "$OS" in 1224 | Ubuntu) 1225 | echo "检测到系统为 Ubuntu,正在安装 Docker..." 1226 | sudo apt-get update 1227 | sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common 1228 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 1229 | sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 1230 | sudo apt-get update 1231 | sudo apt-get install -y docker-ce 1232 | ;; 1233 | Debian|Armbian) 1234 | echo "检测到系统为 Debian 或 Armbian,正在安装 Docker..." 1235 | sudo apt-get update 1236 | sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common 1237 | curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - 1238 | sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian $(lsb_release -cs) stable" 1239 | sudo apt-get update 1240 | sudo apt-get install -y docker-ce 1241 | ;; 1242 | centos|rhel|fedora) 1243 | echo "检测到系统为 CentOS,正在安装 Docker..." 1244 | sudo yum install -y yum-utils 1245 | sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 1246 | sudo yum install -y docker-ce docker-ce-cli containerd.io 1247 | sudo systemctl start docker 1248 | sudo systemctl enable docker 1249 | ;; 1250 | openwrt|lede) 1251 | echo "检测到系统为 OpenWRT/LEDE,正在安装 Docker..." 1252 | opkg update 1253 | opkg install dockerd docker-compose luci-app-dockerman 1254 | /etc/init.d/dockerd start 1255 | /etc/init.d/dockerd enable 1256 | ;; 1257 | *) 1258 | echo "不支持的操作系统: $OS" 1259 | exit 1 1260 | ;; 1261 | esac 1262 | 1263 | # 如果不是 OpenWRT/LEDE,则启动和启用 Docker 1264 | if [[ "$OS" != "openwrt" && "$OS" != "lede" ]]; then 1265 | sudo systemctl start docker 1266 | sudo systemctl enable docker 1267 | fi 1268 | 1269 | echo -e "${GREEN}Docker 安装完成。${RESET}" 1270 | } 1271 | 1272 | # 检查 jq 工具 是否安装 1273 | check_and_install_jq() { 1274 | if ! command -v jq &> /dev/null; then 1275 | echo "jq 工具未安装,正在安装..." 1276 | 1277 | if check_if_in_china; then 1278 | INSTALL_CMD="sudo apt-get update && sudo apt-get install -y jq --allow-releaseinfo-change" 1279 | elif command -v apt-get &> /dev/null; then 1280 | INSTALL_CMD="sudo apt-get update && sudo apt-get install -y jq" 1281 | elif command -v yum &> /dev/null; then 1282 | INSTALL_CMD="sudo yum install -y jq" 1283 | elif command -v apk &> /dev/null; then 1284 | INSTALL_CMD="sudo apk add --no-cache jq" 1285 | elif command -v opkg &> /dev/null; then # OpenWrt, Entware 环境 1286 | INSTALL_CMD="opkg update && opkg install jq" 1287 | else 1288 | echo "无法识别该系统的包管理器,jq 安装失败。" 1289 | return 1 # 无法识别包管理器,安装失败 1290 | fi 1291 | 1292 | if ! eval "$INSTALL_CMD"; then 1293 | echo "安装 jq 失败,请检查系统配置,将影响 参数 功能。" 1294 | return 1 # 安装失败 1295 | fi 1296 | else 1297 | return 0 # jq 已安装 1298 | fi 1299 | } 1300 | 1301 | # 检查 grep 工具 是否安装 1302 | check_and_install_grep() { 1303 | if ! command -v grep &> /dev/null; then 1304 | echo "grep 工具未安装,正在安装..." 1305 | 1306 | if check_if_in_china; then 1307 | INSTALL_CMD="apt-get update && sudo apt-get install -y grep --allow-releaseinfo-change" 1308 | elif command -v apt-get &> /dev/null; then 1309 | INSTALL_CMD="sudo apt-get update && sudo apt-get install -y grep" 1310 | elif command -v yum &> /dev/null; then 1311 | INSTALL_CMD="sudo yum install -y grep" 1312 | elif command -v apk &> /dev/null; then 1313 | INSTALL_CMD="sudo apk add --no-cache grep" 1314 | elif command -v opkg &> /dev/null; then # OpenWrt, Entware 环境 1315 | INSTALL_CMD="opkg update && opkg install grep" 1316 | else 1317 | echo "安装 grep 失败,请检查系统配置,将影响 Watchtower 功能。" 1318 | return 1 # 安装失败 1319 | fi 1320 | 1321 | # 执行安装命令 1322 | if ! eval "$INSTALL_CMD"; then 1323 | echo "安装 grep 失败,请检查系统配置,将影响 Watchtower 功能。" 1324 | return 1 # 安装失败 1325 | fi 1326 | else 1327 | return 0 # grep 已安装 1328 | fi 1329 | } 1330 | 1331 | # 设置反向代理参数 1332 | proxy() { 1333 | source "$CONFIG_FILE" 1334 | 1335 | read -p "请输入反向代理地址 (当前值: ${REVERSE_PROXY:-未设置}, 输入null清空): " input_reverse_proxy 1336 | 1337 | if [ -n "$input_reverse_proxy" ]; then 1338 | [ "$input_reverse_proxy" = "null" ] && REVERSE_PROXY="" || REVERSE_PROXY="$input_reverse_proxy" 1339 | fi 1340 | 1341 | echo "反向代理地址已更新为: ${REVERSE_PROXY:-<空>}" 1342 | echo "REVERSE_PROXY=${REVERSE_PROXY:-}" > "$CONFIG_FILE" 1343 | } 1344 | 1345 | # 清理 Docker 工具 1346 | cleanup_docker() { 1347 | echo -e "\n${YELLOW}┌─────────────────── Docker 完全清理 ───────────────────┐${RESET}" 1348 | echo -e "${YELLOW}│${RESET} 此操作将执行: ${YELLOW}│${RESET}" 1349 | echo -e "${YELLOW}│${RESET} • 删除所有已停止的容器 ${YELLOW}│${RESET}" 1350 | echo -e "${YELLOW}│${RESET} • 删除所有未使用的镜像和构建缓存 ${YELLOW}│${RESET}" 1351 | echo -e "${YELLOW}│${RESET} • 删除所有未使用的卷和网络 ${YELLOW}│${RESET}" 1352 | echo -e "${YELLOW}│${RESET} • 清空所有容器的日志文件 ${YELLOW}│${RESET}" 1353 | echo -e "${YELLOW}└───────────────────────────────────────────────────────┘${RESET}" 1354 | 1355 | echo -e "\n${RED}⚠️ 警告:此操作将删除大量数据,且无法恢复!${RESET}" 1356 | read -p "$(echo -e "${CYAN}确认执行完全清理? (y/n,默认n): ${RESET}")" confirm 1357 | confirm=${confirm:-n} 1358 | 1359 | if [[ "$confirm" != "y" ]]; then 1360 | echo -e "\n${YELLOW}清理操作已取消${RESET}" 1361 | read -p "$(echo -e "${CYAN}按回车键返回主菜单...${RESET}")" 1362 | return 1363 | fi 1364 | 1365 | # 统计数据 1366 | container_count=0 1367 | cleaned_logs=0 1368 | total_freed=0 1369 | 1370 | # 第1步:清理容器日志 1371 | echo -e "\n${YELLOW}[1/2] 正在清理容器日志...${RESET}" 1372 | 1373 | for container_id in $(docker ps -aq); do 1374 | container_count=$((container_count+1)) 1375 | container_name=$(docker inspect --format '{{.Name}}' $container_id | sed 's/\///') 1376 | log_path=$(docker inspect --format='{{.LogPath}}' $container_id) 1377 | 1378 | if [ -f "$log_path" ]; then 1379 | log_size=$(du -b "$log_path" | awk '{print $1}') 1380 | total_freed=$((total_freed + log_size)) 1381 | 1382 | if [ $log_size -ge 1073741824 ]; then 1383 | log_size_h=$(echo "scale=2; $log_size/1073741824" | bc) 1384 | log_size_h="${log_size_h} GB" 1385 | elif [ $log_size -ge 1048576 ]; then 1386 | log_size_h=$(echo "scale=2; $log_size/1048576" | bc) 1387 | log_size_h="${log_size_h} MB" 1388 | elif [ $log_size -ge 1024 ]; then 1389 | log_size_h=$(echo "scale=2; $log_size/1024" | bc) 1390 | log_size_h="${log_size_h} KB" 1391 | else 1392 | log_size_h="${log_size} bytes" 1393 | fi 1394 | 1395 | echo -e "${GREEN}✓${RESET} 清理容器 ${CYAN}${container_name}${RESET} 日志 (${log_size_h})" 1396 | echo "" > "$log_path" 1397 | cleaned_logs=$((cleaned_logs+1)) 1398 | fi 1399 | done 1400 | 1401 | if [ $total_freed -ge 1073741824 ]; then 1402 | total_freed_h=$(echo "scale=2; $total_freed/1073741824" | bc) 1403 | total_freed_h="${total_freed_h} GB" 1404 | elif [ $total_freed -ge 1048576 ]; then 1405 | total_freed_h=$(echo "scale=2; $total_freed/1048576" | bc) 1406 | total_freed_h="${total_freed_h} MB" 1407 | elif [ $total_freed -ge 1024 ]; then 1408 | total_freed_h=$(echo "scale=2; $total_freed/1024" | bc) 1409 | total_freed_h="${total_freed_h} KB" 1410 | else 1411 | total_freed_h="${total_freed} bytes" 1412 | fi 1413 | 1414 | # 第2步:执行Docker系统清理 1415 | echo -e "\n${YELLOW}[2/2] 正在执行Docker系统清理...${RESET}" 1416 | docker_prune_output=$(docker system prune -a --volumes -f) 1417 | 1418 | # 总结结果 1419 | echo -e "\n${GREEN}══════════════ 清理完成 ══════════════${RESET}" 1420 | echo -e "${GREEN}• 检查了 ${container_count} 个容器${RESET}" 1421 | echo -e "${GREEN}• 清理了 ${cleaned_logs} 个日志文件 (释放约 ${total_freed_h})${RESET}" 1422 | echo -e "${GREEN}• 执行了Docker系统完全清理${RESET}" 1423 | echo -e "${GREEN}══════════════════════════════════════${RESET}" 1424 | 1425 | echo 1426 | read -p "$(echo -e "${CYAN}按回车键返回主菜单...${RESET}")" 1427 | } 1428 | 1429 | # 生成随机端口 1430 | generate_random_port() { 1431 | local port 1432 | while :; do 1433 | port=$(shuf -i 10000-65535 -n 1) 1434 | 1435 | if ! ss -tuln | grep -q ":$port "; then 1436 | echo "$port" 1437 | break 1438 | fi 1439 | done 1440 | } 1441 | 1442 | # 检查端口 1443 | check_and_allocate_port() { 1444 | local port=$1 1445 | if ss -tuln | grep -q ":$port "; then 1446 | echo "端口 $port 已被占用,正在分配新的端口..." 1447 | port=$(generate_random_port) 1448 | fi 1449 | echo "$port" 1450 | } 1451 | 1452 | # # 检查并更新 SH 脚本 1453 | download_NoobIPTV() { 1454 | REMOTE_VERSION=$(curl -s "https://yang-1989.eu.org/NoobIPTV_version.txt") 1455 | 1456 | if [ $? -ne 0 ]; then 1457 | echo -e "${RED}无法检测版本,请检查网络连接。${RESET}" 1458 | return 1459 | fi 1460 | 1461 | if [ -f "$SCRIPT_PATH" ]; then 1462 | LOCAL_VERSION=$(grep -oP '(?<=^# 最新版本:).*' "$SCRIPT_PATH") 1463 | else 1464 | LOCAL_VERSION="" 1465 | fi 1466 | 1467 | if [ "$REMOTE_VERSION" != "$LOCAL_VERSION" ]; then 1468 | echo "${GREEN}正在下载最新版本的 NoobIPTV 脚本...${RESET}" 1469 | curl -o "$SCRIPT_PATH" "https://yang-1989.eu.org/NoobIPTV.sh" 1470 | chmod +x "$SCRIPT_PATH" 1471 | echo -e "${GREEN}最新 $REMOTE_VERSION 版本下载已完成。${RESET}" 1472 | fi 1473 | } 1474 | 1475 | # 设置快捷键 1476 | setup_shortcut() { 1477 | local script_path="$HOME/NoobIPTV.sh" 1478 | echo "脚本路径: $script_path" 1479 | 1480 | curl -sL https://yang-1989.eu.org/NoobIPTV.sh -o "$script_path" 1481 | chmod +x "$script_path" 1482 | 1483 | local shell_rc="$HOME/.bashrc" 1484 | echo "配置文件: $shell_rc" 1485 | 1486 | if [ -n "$shell_rc" ] && ! grep -q "alias y='bash $script_path'" "$shell_rc"; then 1487 | echo "alias y='bash $script_path'" >> "$shell_rc" 1488 | echo -e "${GREEN}已设置快捷键 'y'。${RESET}" 1489 | source "$shell_rc" 2>/dev/null || true 1490 | echo -e "${GREEN}快捷键已生效!现在可以使用 'y' 命令启动脚本。${RESET}" 1491 | fi 1492 | } 1493 | 1494 | # 展示广告 1495 | show_NoobIPTV() { 1496 | echo -e "${CYAN}───────────────────────────────────────────────────────────────────────${RESET} 1497 | ${RED} ███╗ ██╗ ██████╗ ██████╗ ██████╗ ██╗██████╗ ████████╗██╗ ██╗${RESET} 1498 | ${RED} ████╗ ██║██╔═══██╗██╔═══██╗██╔══██╗██║██╔══██╗╚══██╔══╝██║ ██║${RESET} 1499 | ${RED} ██╔██╗ ██║██║ ██║██║ ██║██████╔╝██║██████╔╝ ██║ ██║ ██║${RESET} 1500 | ${RED} ██║╚██╗██║██║ ██║██║ ██║██╔══██╗██║██╔═══╝ ██║ ╚██╗ ██╔╝${RESET} 1501 | ${RED} ██║ ╚████║╚██████╔╝╚██████╔╝██████╔╝██║██║ ██║ ╚████╔╝ ${RESET} 1502 | ${RED} ╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═╝ ╚═══╝ ${RESET} 1503 | ${GREEN} 欢迎关注我们的 ${YELLOW}Telegram ${GREEN}频道: ${CYAN}@Y_anGGGGGG${RESET} 1504 | ${CYAN}───────────────────────────────────────────────────────────────────────${RESET} 1505 | ${YELLOW} IPTV项目小白必备的搭建脚本和便捷工具箱,输入 ${GREEN}y${YELLOW} 快捷启动!${RESET}" 1506 | } 1507 | 1508 | 1509 | # 检查是否是第一次运行 1510 | check_first_run() { 1511 | local config_dir="$HOME/.config/NoobIPTV" 1512 | local first_run_flag="$config_dir/initialized" 1513 | 1514 | if [ ! -d "$config_dir" ]; then 1515 | mkdir -p "$config_dir" 1516 | fi 1517 | 1518 | if [ ! -f "$first_run_flag" ]; then 1519 | echo -e "${CYAN}首次运行,正在进行初始化设置...${RESET}" 1520 | [ ! -f "$CONFIG_FILE" ] && echo "REVERSE_PROXY=$REVERSE_PROXY" > "$CONFIG_FILE" # 设置配置文件 1521 | setup_shortcut # 设置快捷键 1522 | touch "$first_run_flag" 1523 | fi 1524 | } 1525 | 1526 | # 脚本信息 1527 | script_log() { 1528 | show_NoobIPTV 1529 | echo "------------------------------------------------" 1530 | echo "项目名称:NoobIPTV" 1531 | echo "项目地址:https://github.com/YanG-1989" 1532 | echo "脚本日志: https://pixman.io/topics/142" 1533 | echo "作者: YanG-1989" 1534 | echo "当前版本号: $(grep -oP '(?<=^# 最新版本:).*' "$SCRIPT_PATH")" 1535 | echo "最后更新时间: 2024.5.15" 1536 | echo "1) 优化 Docker 管理助手 " 1537 | echo "2) 新增 LibreTV 快捷部署" 1538 | echo "3) 修复 Fourgtv 项目 作者: @刘墉 " 1539 | echo "4) 更新 Doubebly 项目 作者: @沐辰 " 1540 | echo "------------------------------------------------" 1541 | read -p "按 回车键 返回 主菜单 ..." 1542 | } 1543 | 1544 | ############# 主程序逻辑 ############# 1545 | 1546 | show_NoobIPTV 1547 | check_first_run # 检查是否是第一次运行 1548 | download_NoobIPTV # 检查并更新 SH 脚本 1549 | [ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE" # 加载配置文件中的参数 1550 | 1551 | # 主循环 1552 | while true; do 1553 | show_menu 1554 | read -p "请选择操作: " choice 1555 | case "$choice" in 1556 | 1) # 部署 pixman 1557 | while true; do 1558 | show_pixman_menu 1559 | read -p "请输入选项 (0-3): " pixman_choice 1560 | case "$pixman_choice" in 1561 | 1) check_docker ; judge_Pixman ;; 1562 | 2) uninstall_Pixman ;; 1563 | 3) proxy ;; 1564 | 0) echo "返回主菜单。" ; break ;; 1565 | *) echo "无效的选项,请输入 0-3。" ;; 1566 | esac 1567 | done 1568 | ;; 1569 | 2) # 部署 Fourgtv 1570 | while true; do 1571 | show_fourgtv_menu 1572 | read -p "请输入选项 (0-3): " fourgtv_choice 1573 | case "$fourgtv_choice" in 1574 | 1) check_docker ; install_Fourgtv ;; 1575 | 2) uninstall_Fourgtv ;; 1576 | 3) proxy ;; 1577 | 0) echo "返回主菜单。" ; break ;; 1578 | *) echo "无效的选项,请输入 0-3。" ;; 1579 | esac 1580 | done 1581 | ;; 1582 | 3) # 部署 Doubebly 1583 | while true; do 1584 | show_doubebly_menu 1585 | read -p "请输入选项 (0-3): " doubebly_choice 1586 | case "$doubebly_choice" in 1587 | 1) check_docker ; install_Doubebly ;; 1588 | 2) uninstall_Doubebly ;; 1589 | 3) proxy ;; 1590 | 0) echo "返回主菜单。" ; break ;; 1591 | *) echo "无效的选项,请输入 0-3。" ;; 1592 | esac 1593 | done 1594 | ;; 1595 | 4) # 管理 Docker 1596 | while true; do 1597 | show_watchtower_menu 1598 | read -p "请输入选项 (0-4): " watchtower_choice 1599 | case "$watchtower_choice" in 1600 | 1) # 手动 watchtower 1601 | if check_internet_connection; then 1602 | update_watchtower 1603 | else 1604 | echo -e "\n${RED}⚠️ 网络连接异常,无法执行更新操作${RESET}" 1605 | echo -e "${YELLOW}请检查网络连接后再尝试此功能${RESET}" 1606 | echo -e "按任意键继续..." 1607 | read -n 1 1608 | fi 1609 | ;; 1610 | 2) # 管理 watchtower 1611 | if check_internet_connection; then 1612 | manage_watchtower 1613 | else 1614 | echo -e "\n${RED}⚠️ 网络连接异常,无法执行管理操作${RESET}" 1615 | echo -e "${YELLOW}请检查网络连接后再尝试此功能${RESET}" 1616 | echo -e "按任意键继续..." 1617 | read -n 1 1618 | fi 1619 | ;; 1620 | 3) cleanup_docker ;; # 清理 Docker 垃圾 1621 | 4) # 设置 Docker 全局日志大小 1622 | curl -L -s https://yang-1989.eu.org/docker.sh | sudo bash 1623 | echo -e "\n配置完成! 按任意键继续..." 1624 | read -n 1 1625 | ;; 1626 | 0) echo "返回主菜单。" ; break ;; 1627 | *) echo "无效的选项,请输入 0-4。" ;; 1628 | esac 1629 | done 1630 | ;; 1631 | 5) # 工具箱 1632 | while true; do 1633 | show_toolbox_menu 1634 | read -p "请输入选项 (0-7): " toolbox_choice 1635 | case "$toolbox_choice" in 1636 | 1) # 1Panel 1637 | while true; do 1638 | show_1panel_menu 1639 | read -p "请输入选项 (0-3): " panel_choice 1640 | case "$panel_choice" in 1641 | 1) install_1panel ;; 1642 | 2) uninstall_1panel ;; 1643 | 3) set_1panel ;; 1644 | 0) echo "返回上级菜单。" ; break ;; 1645 | *) echo "无效的选项,请输入 0-3。" ;; 1646 | esac 1647 | done 1648 | ;; 1649 | 2) # o11 1650 | while true; do 1651 | show_o11_menu 1652 | read -p "请输入选项 (0-2): " o_choice 1653 | case "$o_choice" in 1654 | 1) check_docker ; install_o11 ;; 1655 | 2) uninstall_o11 ;; 1656 | 0) echo "返回上级菜单。" ; break ;; 1657 | *) echo "无效的选项,请输入 0-2。" ;; 1658 | esac 1659 | done 1660 | ;; 1661 | 3) # 3X-UI 1662 | while true; do 1663 | show_3x_ui_menu 1664 | read -p "请输入选项 (0-3): " ui_choice 1665 | case "$ui_choice" in 1666 | 1) check_docker ; install_3x_ui ;; 1667 | 2) update_3x_ui ;; 1668 | 3) uninstall_3x_ui ;; 1669 | 0) echo "返回上级菜单。" ; break ;; 1670 | *) echo "无效的选项,请输入 0-3。" ;; 1671 | esac 1672 | done 1673 | ;; 1674 | 4) # Sub Store 1675 | while true; do 1676 | show_subs_menu 1677 | read -p "请输入选项 (0-2): " Sub_choice 1678 | case "$Sub_choice" in 1679 | 1) echo check_docker ; install_sub_store ;; 1680 | 2) echo uninstall_sub_store ;; 1681 | 0) echo "返回上级菜单。" ; break ;; 1682 | *) echo "无效的选项,请输入 0-2。" ;; 1683 | esac 1684 | done 1685 | ;; 1686 | 5) # LibreTV 1687 | while true; do 1688 | show_libretv_menu 1689 | read -p "请输入选项 (0-2): " LibreTV_choice 1690 | case "$LibreTV_choice" in 1691 | 1) check_docker ; install_libretv ;; 1692 | 2) echo uninstall_libretv ;; 1693 | 0) echo "返回上级菜单。" ; break ;; 1694 | *) echo "无效的选项,请输入 0-2。" ;; 1695 | esac 1696 | done 1697 | ;; 1698 | 6) install_233boy ;; # sing-box 1699 | 7) install_Jimmy ;; # Alice DNS 1700 | 0) echo "返回主菜单。" ; break ;; 1701 | *) echo "无效的选项,请输入 0-7。" ;; 1702 | esac 1703 | done 1704 | ;; 1705 | 6) script_log ;; 1706 | 0) echo "退出脚本。" ; exit 0 ;; 1707 | *) echo "无效的选项,请输入 0-6。" ;; 1708 | esac 1709 | done 1710 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # 仓库简介 3 | #### 个人爱好,收集整合!佛系更新… 4 | * [Telegram 群「传送门」](https://t.me/Y_anGGGGGG) 5 | >软件下载,资源集合,没其他东西 (后期可能会分享喜欢的东西)... 6 | * [疑难杂症「传送门」](https://github.com/YanG-1989/m3u/issues) 7 | >有问题请留言,基本上置顶已经解答了所有的问题... 8 | --- 9 | ### 推荐软件「你说了算」 10 | * IOS系统 11 | >APTV「多端」 12 | * 安卓系统 13 | >OK影视「双端」 14 | >天光云影「电视端」 15 | >TiviMate「电视端」 16 | >OTT「电视端」 17 | >Televizo「手机端」 18 | * Win系统 19 | >VideoPlayer「浏览器」 20 | >SFVIP-Player「电脑端」 21 | >PotPlayer「电脑端」 22 | >QMPlay2「电脑端」 23 | >ZyPlayer「电脑端」 24 | --- 25 | ### 订阅地址「懒人必备」 26 | * [Gather.m3u「精简版」](https://bit.ly/IPTV-Gather) 27 | > 订阅地址「GitHub版」,IPV6·源为主... 28 | * [Gather.m3u「完整版」](https://tv.iill.top/m3u/Gather) 29 | > 订阅地址「VPS版」,请勿直接打开... 30 | --- 31 | ### 直播集合「一切随缘」 32 | * [Live.m3u「多平台」](https:///tv.iill.top/m3u/Live) 33 | >直播平台 订阅地址「收集网友喜欢的直播间...」 34 | * [个性化 M3U 定制](https://m.iill.top) 35 | >定制自己的直播 M3U 列表「分享自己喜欢的主播..」 36 | --- 37 | ### 垃圾话语录「历史记录」 38 | * 2025.5.8 39 | >维护 Live「优化 直播间在线 / 准确率 」 40 | >维护 Live「修复 Youtube ID 识别 BUG 」 41 | * 2025.4.30 42 | >维护 Gather「修复 •咪咕源」 43 | * 2025.4.29 44 | >增加 Json 格式订阅「其他问题·待定」 45 | >维护 Live「更新周期改为 15 分钟」 46 | * 2025.4.1 47 | >维护 Gather「删除 •咪咕源 / 当作节目表吧」 48 | >维护 Live「修复 斗鱼部分直播间 不显示BUG」 49 | * 2025.2.8 50 | >维护 Gather「修复 •部分源」 51 | >维护 Live「修复生成错误 BUG」 52 | * 2025.2.4 53 | >重启 Gather「删除 •IPV6 源 / •國際「匯集」」 54 | >重启 Live「备份文件为1月1号 / 更新周期改为 30 分钟」 55 | * 2025.1.10 56 | >维护 Gather「修复 •IPV6 源 / 删除 埋堆堆」 57 | >新增 Migu「提取 咪咕·IPV4」---([修改 hosts 方法](https://raw.githubusercontent.com/YanG-1989/m3u/refs/heads/main/hosts.txt)) 58 | --- 59 | 60 | ### 声明「佛曰需要」 61 | * 本资料中的所有资源均来自网络,仅作为爱好者的收集和分享之用,版权归原作者或原版权方所有。如有侵权,请联系本人删除。本资料仅供学习与交流使用,请勿用于商业用途。 62 | -------------------------------------------------------------------------------- /Watchtower.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ############################### 3 | # Watchtower 管理工具 4 | # 作者: YanG-1989 5 | # 项目地址:https://github.com/YanG-1989 6 | # 最新版本:1.0.0 7 | ############################### 8 | 9 | REVERSE_PROXY="docker.zhai.cm" # 设置反向代理地址 10 | 11 | # 设置颜色变量 12 | RED="\033[1;31m" 13 | GREEN="\033[1;32m" 14 | YELLOW="\033[1;33m" 15 | CYAN="\033[1;36m" 16 | RESET="\033[0m" 17 | 18 | 19 | # 显示主菜单 20 | show_watchtower_menu() { 21 | echo "----------------------" 22 | echo " Watchtower 菜单: " 23 | echo "----------------------" 24 | echo "1) 一键更新 Docker 项目" 25 | echo "2) 管理 Docker 项目更新" 26 | echo "3) 一键清理 Docker 垃圾" 27 | echo "----------------------" 28 | echo "0) 退出脚本 " 29 | echo "----------------------" 30 | } 31 | 32 | # 一键更新指定容器 33 | update_watchtower() { 34 | echo "===== 目前运行中的容器 =====" 35 | local running_containers=$(docker ps --format "{{.Names}}") 36 | 37 | if [ -n "$running_containers" ]; then 38 | echo "可选容器列表:" 39 | local index=1 40 | declare -A all_container_map 41 | 42 | while IFS= read -r container; do 43 | all_container_map[$index]=$container 44 | echo "$index. $container" 45 | ((index++)) 46 | done <<< "$running_containers" 47 | 48 | echo "" 49 | echo "容器总数: $((index-1))" 50 | 51 | read -p "请选择要更新的容器编号: " container_choice 52 | 53 | if [[ $container_choice -ge 1 && $container_choice -lt $index ]]; then 54 | local selected_container=${all_container_map[$container_choice]} 55 | echo -e "${CYAN}正在检测容器: $selected_container${RESET}" 56 | 57 | local watchtower_output 58 | watchtower_output=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower "$selected_container" --run-once -c 2>&1) 59 | 60 | local failed scanned updated 61 | if [[ $watchtower_output =~ Failed=([0-9]+) ]]; then 62 | failed="${BASH_REMATCH[1]}" 63 | fi 64 | if [[ $watchtower_output =~ Scanned=([0-9]+) ]]; then 65 | scanned="${BASH_REMATCH[1]}" 66 | fi 67 | if [[ $watchtower_output =~ Updated=([0-9]+) ]]; then 68 | updated="${BASH_REMATCH[1]}" 69 | fi 70 | 71 | if [[ $failed -eq 1 && $scanned -eq 1 && $updated -eq 0 ]]; then 72 | echo -e "${RED}检测失败。${RESET}" 73 | elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 0 ]]; then 74 | echo -e "${YELLOW}无需更新。${RESET}" 75 | elif [[ $failed -eq 0 && $scanned -eq 1 && $updated -eq 1 ]]; then 76 | echo -e "${GREEN}更新成功!${RESET}" 77 | else 78 | echo "未知的检测结果。" 79 | fi 80 | else 81 | echo "无效的选择。" 82 | fi 83 | else 84 | echo "没有运行中的容器。" 85 | fi 86 | } 87 | 88 | # 管理 Watchtower 监控容器 89 | manage_watchtower() { 90 | declare -A all_container_map 91 | declare -A container_map 92 | 93 | show_monitored_containers() { 94 | existing_args=$(docker inspect --format '{{.Args}}' watchtower) 95 | monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*") 96 | 97 | echo "===== Watchtower 当前监控的容器 =====" 98 | if [ -n "$monitored_containers" ]; then 99 | echo "监控的容器列表:" 100 | local index=1 101 | container_map=() 102 | 103 | for container in $monitored_containers; do 104 | container_map[$index]=$container 105 | if docker ps --format "{{.Names}}" | grep -q "^$container$"; then 106 | echo -e "$index. $container (运行中)" 107 | else 108 | echo -e "$index. $container (未运行)" 109 | fi 110 | ((index++)) 111 | done 112 | echo "" 113 | echo "容器总数: $((index-1))" 114 | else 115 | echo "当前没有监控任何容器。" 116 | return 1 117 | fi 118 | } 119 | 120 | show_all_containers() { 121 | echo "===== 目前运行中的容器 =====" 122 | local running_containers=$(docker ps --format "{{.Names}}" | grep -v "^watchtower$") 123 | if [ -n "$running_containers" ]; then 124 | echo "可选容器列表:" 125 | local index=1 126 | all_container_map=() 127 | 128 | while IFS= read -r container; do 129 | all_container_map[$index]=$container 130 | echo "$index. $container" 131 | ((index++)) 132 | done <<< "$running_containers" 133 | echo "" 134 | echo "容器总数: $((index-1))" 135 | return 0 136 | else 137 | echo "当前没有运行中的容器。" 138 | return 1 139 | fi 140 | } 141 | 142 | echo "Watchtower - 自动更新 Docker 镜像与容器" 143 | echo -e "请选择操作类型:" 144 | echo "1. 添加监控容器" 145 | echo "2. 删除监控容器" 146 | read -rp "请输入选项 [1/2]:" action 147 | 148 | case "$action" in 149 | 1) # 添加容器 150 | if show_all_containers; then 151 | read -rp "请输入要添加到监控的容器编号:" number 152 | if [[ $number =~ ^[0-9]+$ ]] && [ -n "${all_container_map[$number]}" ]; then 153 | name=${all_container_map[$number]} 154 | install_watchtower "$name" 155 | else 156 | echo "编号无效,请重试。" 157 | fi 158 | fi 159 | ;; 160 | 2) # 删除容器 161 | if show_monitored_containers; then 162 | read -rp "请输入要删除的监控容器编号:" number 163 | if [[ $number =~ ^[0-9]+$ ]] && [ -n "${container_map[$number]}" ]; then 164 | name=${container_map[$number]} 165 | uninstall_watchtower "$name" 166 | else 167 | echo "编号无效,请重试。" 168 | fi 169 | fi 170 | ;; 171 | *) 172 | echo "无效选项,请选择 1 或 2。" 173 | ;; 174 | esac 175 | } 176 | 177 | # 安装/配置 Watchtower 178 | install_watchtower() { 179 | local name="$1" 180 | 181 | if [ -z "$name" ]; then 182 | echo -e "${RED}错误: 未指定要监控的容器名称${RESET}" 183 | return 1 184 | fi 185 | 186 | local monitored_containers="" 187 | 188 | if docker ps -q -f name=watchtower > /dev/null 2>&1; then 189 | existing_args=$(docker inspect --format '{{.Args}}' watchtower) 190 | monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*") 191 | 192 | if echo "$monitored_containers" | grep -qw "$name"; then 193 | echo "---------------------------------------------------------" 194 | echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}" 195 | echo "---------------------------------------------------------" 196 | return 0 197 | fi 198 | 199 | monitored_containers="${monitored_containers:+$monitored_containers }$name" 200 | 201 | docker stop watchtower > /dev/null 2>&1 202 | docker rm watchtower > /dev/null 2>&1 203 | else 204 | monitored_containers="$name" 205 | fi 206 | 207 | echo "正在安装或配置 Watchtower 并监控 $name 镜像更新..." 208 | 209 | IMAGE_SOURCE="containrrr/watchtower" 210 | PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower" 211 | 212 | if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then 213 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 214 | if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then 215 | echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}" 216 | return 1 217 | fi 218 | IMAGE_SOURCE="$PROXY_IMAGE_SOURCE" 219 | fi 220 | 221 | if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then 222 | echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}" 223 | return 1 224 | fi 225 | 226 | echo "---------------------------------------------------------" 227 | echo -e "${CYAN}■ 服务器将于每天凌晨五点,进行 $name 检测更新。${RESET}" 228 | echo "---------------------------------------------------------" 229 | return 0 230 | } 231 | 232 | # 删除 Watchtower 监控 233 | uninstall_watchtower() { 234 | local name="$1" 235 | 236 | if docker ps -q -f name=watchtower > /dev/null 2>&1; then 237 | existing_args=$(docker inspect --format '{{.Args}}' watchtower) 238 | monitored_containers=$(echo "$existing_args" | grep -oP '([a-zA-Z0-9\-]+)' | grep -vE "cleanup|c|s|^0$|^5$|\*") 239 | 240 | if echo "$monitored_containers" | grep -qw "$name"; then 241 | # 移除指定容器名称 242 | monitored_containers=$(echo "$monitored_containers" | sed "s/\b$name\b//g" | xargs) 243 | 244 | if [ -z "$monitored_containers" ]; then 245 | echo "没有其他监控的容器,正在停止并删除 Watchtower..." 246 | docker stop watchtower > /dev/null 2>&1 247 | docker rm watchtower > /dev/null 2>&1 248 | docker images --format '{{.Repository}}:{{.Tag}}' | grep 'containrrr/watchtower' | xargs -r docker rmi > /dev/null 2>&1 249 | echo "Watchtower 已成功卸载。" 250 | else 251 | docker stop watchtower > /dev/null 2>&1 252 | docker rm watchtower > /dev/null 2>&1 253 | 254 | IMAGE_SOURCE="containrrr/watchtower" 255 | PROXY_IMAGE_SOURCE="${REVERSE_PROXY}/containrrr/watchtower" 256 | 257 | if ! docker pull "$IMAGE_SOURCE" > /dev/null 2>&1; then 258 | echo -e "${CYAN}尝试使用代理拉取镜像...${RESET}" 259 | if ! docker pull "$PROXY_IMAGE_SOURCE" > /dev/null 2>&1; then 260 | echo -e "${RED}安装 watchtower 失败,请检查反向代理或网络连接。${RESET}" 261 | return 1 262 | fi 263 | IMAGE_SOURCE="$PROXY_IMAGE_SOURCE" 264 | fi 265 | 266 | if ! docker run -d --name watchtower --restart always -e TZ=Asia/Shanghai -v /var/run/docker.sock:/var/run/docker.sock $IMAGE_SOURCE $monitored_containers -c -s "0 0 5 * * *" > /dev/null 2>&1; then 267 | echo -e "${RED}Watchtower 运行失败,请检查日志。${RESET}" 268 | return 1 269 | fi 270 | echo -e "${GREEN}$name${RESET} 容器已从监控中删除。" 271 | fi 272 | else 273 | echo "容器 $name 未被 Watchtower 监控。" 274 | fi 275 | else 276 | echo "Watchtower 当前未安装。" 277 | fi 278 | } 279 | 280 | # 清理 Docker 工具 281 | cleanup_docker() { 282 | echo -e "🚨 警告:此操作将删除所有已停止的容器、未使用的镜像和卷。" 283 | read -p "你确认要继续吗?(y/n,默认n): " confirm 284 | confirm=${confirm:-n} 285 | 286 | if [[ "$confirm" != "y" ]]; then 287 | echo -e "${RED}清理已取消。${RESET}" 288 | return 289 | fi 290 | 291 | docker system prune -a --volumes -f 292 | 293 | echo -e "${GREEN}🎉 清理完成。${RESET}" 294 | } 295 | 296 | # 设置快捷键 297 | setup_shortcut() { 298 | local script_path="$HOME/watchtower.sh" 299 | echo "脚本路径: $script_path" 300 | 301 | curl -sL https://yang-1989.eu.org/watchtower.sh -o "$script_path" 302 | chmod +x "$script_path" 303 | 304 | local shell_rc="$HOME/.bashrc" # root 用户的情况下要确保是 /root/.bashrc 305 | echo "配置文件: $shell_rc" 306 | 307 | if [ -n "$shell_rc" ] && ! grep -q "alias wt='bash $script_path'" "$shell_rc"; then 308 | echo "alias wt='bash $script_path'" >> "$shell_rc" 309 | echo -e "${GREEN}已设置快捷键 'wt'。${RESET}" 310 | source "$shell_rc" 2>/dev/null || true 311 | echo -e "${GREEN}快捷键已生效!现在可以使用 'wt' 命令启动脚本。${RESET}" 312 | fi 313 | } 314 | 315 | # 检查是否是第一次运行 316 | check_first_run() { 317 | local config_dir="$HOME/.config/watchtower" 318 | local first_run_flag="$config_dir/initialized" 319 | 320 | if [ ! -d "$config_dir" ]; then 321 | mkdir -p "$config_dir" 322 | fi 323 | 324 | if [ ! -f "$first_run_flag" ]; then 325 | echo -e "${CYAN}首次运行,正在进行初始化设置...${RESET}" 326 | setup_shortcut 327 | # 创建标记文件 328 | touch "$first_run_flag" 329 | fi 330 | } 331 | 332 | 333 | # 主程序入口 334 | main() { 335 | # 添加首次运行检查 336 | check_first_run 337 | 338 | while true; do 339 | show_watchtower_menu 340 | read -p "请选择操作 [0-4]: " choice 341 | case $choice in 342 | 0) 343 | echo "退出脚本..." 344 | exit 0 345 | ;; 346 | 1) 347 | update_watchtower 348 | ;; 349 | 2) 350 | manage_watchtower 351 | ;; 352 | 3) 353 | cleanup_docker 354 | ;; 355 | *) 356 | echo "无效的选择,请重试。" 357 | ;; 358 | esac 359 | echo "" 360 | read -p "按 Enter 键继续..." 361 | done 362 | } 363 | 364 | # 执行主程序 365 | main -------------------------------------------------------------------------------- /hosts.txt: -------------------------------------------------------------------------------- 1 | 咪咕全网-解决方案 ( itv 方法通用,注意URL的域名.) 2 | 3 | 解决方法一映射DNS: 4 | (QX的映射dns写法,其他代理软件同理.) 5 | (pixman.io.fifalive.dnsany.com 可替换成 dns 域名 其中一个) 6 | 7 | [DNS] 8 | alias = /studentlive.migucloud.com/pixman.io.fifalive.dnsany.com 9 | alias = /zqhswlive.itv.cmvideo.cn/pixman.io.fifalive.dnsany.com 10 | 11 | 「映射 DNS 引用 pixman 大佬部署好的解析,咪咕全网即可享有全网体验」 12 | 13 | 解决方法二修改hosts: 14 | (IP具有时效性,需自行替换.) 15 | 16 | 通过 ping「dns 域名」获得一个 IP 地址 (https://www.itdog.cn/dns/),然后将该 IP 地址用于 hosts 文件中 (建议修改路由器hosts文件) 。 17 | 18 | 0.0.0.0 studentlive.migucloud.com 19 | 0.0.0.0 zqhswlive.itv.cmvideo.cn 20 | 21 | 「每个设备的hosts文件位置,不一样自行寻找..」 22 | ---------------------------------------------------- 23 | dns 域名 (随便选一个): 24 | pixman.io.ystenlive.dnsany.com 25 | pixman.io.bestlive.dnsany.com 26 | pixman.io.wasulive.dnsany.com 27 | pixman.io.fifalive.dnsany.com 28 | pixman.io.hnbblive.dnsany.com 29 | --------------------------------------------------------------------------------