所以问题是这样的:我编写了一个通过 Lord_of_Rings 的 nodpi 代理服务器运行 YouTube 的程序:https://habr.com/ru/articles/870110/
我总是在 Linux 中编写代码,我启动它,检查它,一切正常。然后我决定为 Windows 制作一个 .exe 文件,挖出一台装有 Windows 8 的旧笔记本电脑,一切就开始了......
我在命令行输入: python -m starter.py
输出:
嗯,我的反应是:好的,我明白了。我写道:python -m starter
没办法:
程序代码位于:https://github.com/MATE-linux/Youtube-app-with-nodpi
附言我尝试指定解释器的完整路径。结果:
PPS 错误是在子进程中使用 python3 时发生的,已在 python 中更正,但是使用子进程的路径不正确,因为编译后它没有意义。现在我已将所有代码重写到一个文件中,但现在它根本无法在 Windows 中运行。日志也丢失了。在 Linux 中编译时它看不到网络。以下是更新后的代码:
import random
import asyncio
BLOCKED = [line.rstrip().encode() for line in open('blacklist.txt', 'r', encoding='utf-8')]
TASKS = []
async def main(host, port):
server = await asyncio.start_server(new_conn, host, port)
await server.serve_forever()
async def pipe(reader, writer):
while not reader.at_eof() and not writer.is_closing():
try:
writer.write(await reader.read(1500))
await writer.drain()
except:
break
writer.close()
async def new_conn(local_reader, local_writer):
http_data = await local_reader.read(1500)
try:
type, target = http_data.split(b"\r\n")[0].split(b" ")[0:2]
host, port = target.split(b":")
except:
local_writer.close()
return
if type != b"CONNECT":
local_writer.close()
return
local_writer.write(b'HTTP/1.1 200 OK\n\n')
await local_writer.drain()
try:
remote_reader, remote_writer = await asyncio.open_connection(host, port)
except:
local_writer.close()
return
if port == b'443':
await fragemtn_data(local_reader, remote_writer)
TASKS.append(asyncio.create_task(pipe(local_reader, remote_writer)))
TASKS.append(asyncio.create_task(pipe(remote_reader, local_writer)))
async def fragemtn_data(local_reader, remote_writer):
head = await local_reader.read(5)
data = await local_reader.read(1500)
parts = []
if all([data.find(site) == -1 for site in BLOCKED]):
remote_writer.write(head + data)
await remote_writer.drain()
return
while data:
part_len = random.randint(1, len(data))
parts.append(bytes.fromhex("1603") + bytes([random.randint(0, 255)]) + int(
part_len).to_bytes(2, byteorder='big') + data[0:part_len])
data = data[part_len:]
remote_writer.write(b''.join(parts))
await remote_writer.drain()
def run_function():
asyncio.run(main(host='127.0.0.1', port=8881))
from multiprocessing import Process
from PyQt5 import QtWebEngineWidgets
from PyQt5 import QtCore, QtGui, QtWidgets, QtNetwork, QtWebEngineWidgets
from PyQt5.QtGui import QIcon
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.webView = QtWebEngineWidgets.QWebEngineView(self.centralwidget)
self.webView.setUrl(QtCore.QUrl("https://www.youtube.com"))
self.webView.setObjectName("webView")
self.gridLayout.addWidget(self.webView, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("Youtube", "Youtube"))
MainWindow.setWindowIcon(QIcon('youtube.png'))
def interface_window():
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
proxy = QtNetwork.QNetworkProxy()
proxy.setType(QtNetwork.QNetworkProxy.HttpProxy)
proxy.setHostName("127.0.0.1")
proxy.setPort(8881)
QtNetwork.QNetworkProxy.setApplicationProxy(proxy)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
def subrun():
run_function()
def substart():
interface_window()
def run():
p1 = Process(target=subrun, args=(), daemon=True)
p2 = Process(target=substart, args=(), daemon=True)
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
run()
通过子进程的路径不正确。并且多处理与 asyncio 冲突。重新编写了线程代码并修复了错误