


Recently I saw a Python PPTV interface in github. Can anyone help convert the algorithm in this interface into PHP?
<code>#!/usr/bin/env python __all__ = ['pptv_download', 'pptv_download_by_id'] from ..common import * import re import time import urllib from random import random def constructKey(arg): def str2hex(s): r="" for i in s[:8]: t=hex(ord(i))[2:] if len(t)==1: t="0"+t r+=t for i in range(16): r+=hex(int(15*random()))[2:] return r #ABANDONED Because SERVER_KEY is static def getkey(s): #returns 1896220160 l2=[i for i in s] l4=0 l3=0 while l4<len(l2): l5=l2[l4] l6=ord(l5) l7=l6<<((l4%4)*8) l3=l3^l7 l4+=1 return l3 pass def rot(k,b): ##>>> in as3 if k>=0: return k>>b elif k<0: return (2**32+k)>>b pass def lot(k,b): return (k<<b)%(2**32) #WTF? def encrypt(arg1,arg2): delta=2654435769 l3=16; l4=getkey(arg2) #1896220160 l8=[i for i in arg1] l10=l4; l9=[i for i in arg2] l5=lot(l10,8)|rot(l10,24)#101056625 # assert l5==101056625 l6=lot(l10,16)|rot(l10,16)#100692230 # assert 100692230==l6 l7=lot(l10,24)|rot(l10,8) # assert 7407110==l7 l11="" l12=0 l13=ord(l8[l12])<<0 l14=ord(l8[l12+1])<<8 l15=ord(l8[l12+2])<<16 l16=ord(l8[l12+3])<<24 l17=ord(l8[l12+4])<<0 l18=ord(l8[l12+5])<<8 l19=ord(l8[l12+6])<<16 l20=ord(l8[l12+7])<<24 l21=(((0|l13)|l14)|l15)|l16 l22=(((0|l17)|l18)|l19)|l20 l23=0 l24=0 while l24<32: l23=(l23+delta)%(2**32) l33=(lot(l22,4)+l4)%(2**32) l34=(l22+l23)%(2**32) l35=(rot(l22,5)+l5)%(2**32) l36=(l33^l34)^l35 l21=(l21+l36)%(2**32) l37=(lot(l21,4)+l6)%(2**32) l38=(l21+l23)%(2**32) l39=(rot(l21,5))%(2**32) l40=(l39+l7)%(2**32) l41=((l37^l38)%(2**32)^l40)%(2**32) l22=(l22+l41)%(2**32) l24+=1 l11+=chr(rot(l21,0)&0xff) l11+=chr(rot(l21,8)&0xff) l11+=chr(rot(l21,16)&0xff) l11+=chr(rot(l21,24)&0xff) l11+=chr(rot(l22,0)&0xff) l11+=chr(rot(l22,8)&0xff) l11+=chr(rot(l22,16)&0xff) l11+=chr(rot(l22,24)&0xff) return l11 loc1=hex(int(arg))[2:]+(16-len(hex(int(arg))[2:]))*"\x00" SERVER_KEY="qqqqqww"+"\x00"*9 res=encrypt(loc1,SERVER_KEY) return str2hex(res) def pptv_download_by_id(id, title = None, output_dir = '.', merge = True, info_only = False): xml = get_html('http://web-play.pptv.com/webplay3-0-%s.xml?type=web.fpp' % id) #vt=3 means vod mode vt=5 means live mode host = r1(r'<sh>([^<>]+)</sh>', xml) k = r1(r'<key expire=[^<>]+>([^<>]+)</key>', xml) rid = r1(r'rid="([^"]+)"', xml) title = r1(r'nm="([^"]+)"', xml) st=r1(r'<st>([^<>]+)</st>',xml)[:-4] st=time.mktime(time.strptime(st))*1000-60*1000-time.time()*1000 st+=time.time()*1000 st=st/1000 key=constructKey(st) pieces = re.findall('<sgm no="(\d+)"[^<>]+fs="(\d+)"', xml) numbers, fs = zip(*pieces) urls=["http://{}/{}/{}?key={}&fpp.ver=1.3.0.4&k={}&type=web.fpp".format(host,i,rid,key,k) for i in range(max(map(int,numbers))+1)] total_size = sum(map(int, fs)) assert rid.endswith('.mp4') print_info(site_info, title, 'mp4', total_size) if not info_only: try: download_urls(urls, title, 'mp4', total_size, output_dir = output_dir, merge = merge) except urllib.error.HTTPError: #for key expired pptv_download_by_id(id, output_dir = output_dir, merge = merge, info_only = info_only) def pptv_download(url, output_dir = '.', merge = True, info_only = False, **kwargs): assert re.match(r'http://v.pptv.com/show/(\w+)\.html$', url) html = get_html(url) id = r1(r'webcfg\s*=\s*{"id":\s*(\d+)', html) assert id pptv_download_by_id(id, output_dir = output_dir, merge = merge, info_only = info_only) </code>
Reply content:
<code>#!/usr/bin/env python __all__ = ['pptv_download', 'pptv_download_by_id'] from ..common import * import re import time import urllib from random import random def constructKey(arg): def str2hex(s): r="" for i in s[:8]: t=hex(ord(i))[2:] if len(t)==1: t="0"+t r+=t for i in range(16): r+=hex(int(15*random()))[2:] return r #ABANDONED Because SERVER_KEY is static def getkey(s): #returns 1896220160 l2=[i for i in s] l4=0 l3=0 while l4<len(l2): l5=l2[l4] l6=ord(l5) l7=l6<<((l4%4)*8) l3=l3^l7 l4+=1 return l3 pass def rot(k,b): ##>>> in as3 if k>=0: return k>>b elif k<0: return (2**32+k)>>b pass def lot(k,b): return (k<<b)%(2**32) #WTF? def encrypt(arg1,arg2): delta=2654435769 l3=16; l4=getkey(arg2) #1896220160 l8=[i for i in arg1] l10=l4; l9=[i for i in arg2] l5=lot(l10,8)|rot(l10,24)#101056625 # assert l5==101056625 l6=lot(l10,16)|rot(l10,16)#100692230 # assert 100692230==l6 l7=lot(l10,24)|rot(l10,8) # assert 7407110==l7 l11="" l12=0 l13=ord(l8[l12])<<0 l14=ord(l8[l12+1])<<8 l15=ord(l8[l12+2])<<16 l16=ord(l8[l12+3])<<24 l17=ord(l8[l12+4])<<0 l18=ord(l8[l12+5])<<8 l19=ord(l8[l12+6])<<16 l20=ord(l8[l12+7])<<24 l21=(((0|l13)|l14)|l15)|l16 l22=(((0|l17)|l18)|l19)|l20 l23=0 l24=0 while l24<32: l23=(l23+delta)%(2**32) l33=(lot(l22,4)+l4)%(2**32) l34=(l22+l23)%(2**32) l35=(rot(l22,5)+l5)%(2**32) l36=(l33^l34)^l35 l21=(l21+l36)%(2**32) l37=(lot(l21,4)+l6)%(2**32) l38=(l21+l23)%(2**32) l39=(rot(l21,5))%(2**32) l40=(l39+l7)%(2**32) l41=((l37^l38)%(2**32)^l40)%(2**32) l22=(l22+l41)%(2**32) l24+=1 l11+=chr(rot(l21,0)&0xff) l11+=chr(rot(l21,8)&0xff) l11+=chr(rot(l21,16)&0xff) l11+=chr(rot(l21,24)&0xff) l11+=chr(rot(l22,0)&0xff) l11+=chr(rot(l22,8)&0xff) l11+=chr(rot(l22,16)&0xff) l11+=chr(rot(l22,24)&0xff) return l11 loc1=hex(int(arg))[2:]+(16-len(hex(int(arg))[2:]))*"\x00" SERVER_KEY="qqqqqww"+"\x00"*9 res=encrypt(loc1,SERVER_KEY) return str2hex(res) def pptv_download_by_id(id, title = None, output_dir = '.', merge = True, info_only = False): xml = get_html('http://web-play.pptv.com/webplay3-0-%s.xml?type=web.fpp' % id) #vt=3 means vod mode vt=5 means live mode host = r1(r'<sh>([^<>]+)</sh>', xml) k = r1(r'<key expire=[^<>]+>([^<>]+)</key>', xml) rid = r1(r'rid="([^"]+)"', xml) title = r1(r'nm="([^"]+)"', xml) st=r1(r'<st>([^<>]+)</st>',xml)[:-4] st=time.mktime(time.strptime(st))*1000-60*1000-time.time()*1000 st+=time.time()*1000 st=st/1000 key=constructKey(st) pieces = re.findall('<sgm no="(\d+)"[^<>]+fs="(\d+)"', xml) numbers, fs = zip(*pieces) urls=["http://{}/{}/{}?key={}&fpp.ver=1.3.0.4&k={}&type=web.fpp".format(host,i,rid,key,k) for i in range(max(map(int,numbers))+1)] total_size = sum(map(int, fs)) assert rid.endswith('.mp4') print_info(site_info, title, 'mp4', total_size) if not info_only: try: download_urls(urls, title, 'mp4', total_size, output_dir = output_dir, merge = merge) except urllib.error.HTTPError: #for key expired pptv_download_by_id(id, output_dir = output_dir, merge = merge, info_only = info_only) def pptv_download(url, output_dir = '.', merge = True, info_only = False, **kwargs): assert re.match(r'http://v.pptv.com/show/(\w+)\.html$', url) html = get_html(url) id = r1(r'webcfg\s*=\s*{"id":\s*(\d+)', html) assert id pptv_download_by_id(id, output_dir = output_dir, merge = merge, info_only = info_only) </code>

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











Both Python and JavaScript's choices in development environments are important. 1) Python's development environment includes PyCharm, JupyterNotebook and Anaconda, which are suitable for data science and rapid prototyping. 2) The development environment of JavaScript includes Node.js, VSCode and Webpack, which are suitable for front-end and back-end development. Choosing the right tools according to project needs can improve development efficiency and project success rate.

Python and C each have their own advantages, and the choice should be based on project requirements. 1) Python is suitable for rapid development and data processing due to its concise syntax and dynamic typing. 2)C is suitable for high performance and system programming due to its static typing and manual memory management.

Laravel is suitable for projects that teams are familiar with PHP and require rich features, while Python frameworks depend on project requirements. 1.Laravel provides elegant syntax and rich features, suitable for projects that require rapid development and flexibility. 2. Django is suitable for complex applications because of its "battery inclusion" concept. 3.Flask is suitable for fast prototypes and small projects, providing great flexibility.

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

IIS and PHP are compatible and are implemented through FastCGI. 1.IIS forwards the .php file request to the FastCGI module through the configuration file. 2. The FastCGI module starts the PHP process to process requests to improve performance and stability. 3. In actual applications, you need to pay attention to configuration details, error debugging and performance optimization.

Multiple calls to session_start() will result in warning messages and possible data overwrites. 1) PHP will issue a warning, prompting that the session has been started. 2) It may cause unexpected overwriting of session data. 3) Use session_status() to check the session status to avoid repeated calls.

Discussion on Hierarchical Structure in Python Projects In the process of learning Python, many beginners will come into contact with some open source projects, especially projects using the Django framework...

Choosing Python or C depends on project requirements: 1) If you need rapid development, data processing and prototype design, choose Python; 2) If you need high performance, low latency and close hardware control, choose C.
