2020年5月8日 星期五

[Python] 使用 http.server.BaseHTTPRequestHandler 製作簡易 Proxy 機制 @ macOS, python 3

學會用 curl / wget 模仿一些 request 後,在一些特殊情境上,還是得弄個 proxy 出來,雖然有 man-in-the-middle Proxy: mitmproxy 可以使用,但有時就是想要單純一點,寫點小程式自娛一下 XD

故事的情境:

- 想用 VLC 播放一些 Streaming 來源,但該 streaming 在存取時要求多塞一些request header,直接播會收到 40X 回應
- VLC 預設只吃 OS Level 的 proxy 設定

基於上述情境,雖然靠 curl/wget 添加 request header 可以搞定,但 VLC 這類就無法達成播放指定來源時多添加 request header。

因此,除了靠 OS Level 的 Proxy server 添加 reader header,就剩寫一隻代抓資料,邊抓邊輸出 stream 的小小程式,程式碼:

import http.server
import urllib.parse
import requests
import time

class ProxyHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
	protocol_version = 'HTTP/1.0'

	def do_GET(self, body=True):
		try:
			target_url = urllib.parse.parse_qs(urllib.parse.urlparse(self.path).query).get('url', None)
			print("[INFO] target_url: "+str(target_url))
			if target_url != None:
				target_url = target_url[0]
				req_header = self.parse_headers()
				#resp = requests.get(target_url, headers=req_header, verify=False, stream=True)
				resp = requests.get(target_url, headers=req_header, verify="certs.pem", stream=True)
				print("[INFO] resp.status_code: %d " % resp.status_code)
				if resp.status_code == 404:
					self.send_response(404)
					self.send_header('Content-Type','text/html')
					self.end_headers()
					self.wfile.write("NOT FOUND".encode())
				else:
					self.send_response(resp.status_code)
					for k in resp.headers.keys():
						print("[INFO] resp.headers: [%s][%s]" % (k, resp.headers[k]) )
						self.send_header(k, resp.headers[k])
					self.end_headers()
					for chunk in resp.iter_content(chunk_size=1024):
						if chunk:
							self.wfile.write(chunk)
							self.wfile.flush()
						else:
							time.sleep(0.05)
				
			else:
				self.send_response(404)
				self.send_header('Content-Type','text/html')
				self.end_headers()
				self.wfile.write("NOT FOUND".encode())
		finally:
			pass

	def parse_headers(self):
		req_header = {}
		for line in self.headers:
			line_parts = [o.strip() for o in line.split(':', 1)]
			if len(line_parts) == 2:
				req_header[line_parts[0]] = line_parts[1]
		return self.inject_header(req_header)
    
	def inject_header(self, headers):
		headers['Referer'] = 'https://example.com/'
       
		return headers
	

if __name__ == '__main__':
	server_address = ('0.0.0.0', 8081)
	httpd = http.server.HTTPServer(server_address, ProxyHTTPRequestHandler)
	print('http server is running')
	httpd.serve_forever()

如此跑起來後,就可以用 http://localhost:8081/?url=https://exmaple.com/streaming 機制,例如 VLC 軟體直接輸入 http://localhost:8081/?url=https://exmaple.com/streaming 位置來嘗試播放。

2020年5月7日 星期四

Raspberry Pi 3 + RetroPie = 電視遊樂器 - 超任為例 @ macOS

Pi 3 + SNES

之前為了研究音控買了個 Pi 3 搭配 Google AIY Projects Voice Kit ,結果研究完就晾在那邊一年多了吧?反而音控設備已買了成品 Google Home mini 和 小愛音箱。最近無聊就想研究一下樹莓派怎樣玩遊戲,實在是已經不只一次看到什麼月光寶盒再賣,還是嘗試一下好了。

果真有個 RetroPie 就是專門做了超級多的電玩模擬器,裝下就搞定了!有幾件事要留意一下:
  • Pi 3 內建無線網卡,但安裝完卻沒法設定,連 ifconfig 都看不到
    • 解法:裝完 RetroPie 系統後,需要先設定 WI-FI Country ,才能正常設定無線網路
  • 在網路上亂找到的 ROM 檔案,擺入後卻無法被偵測或運行
    • 解法:還是裝一套 PC 版的來驗證吧 :P 有時真的是網路上的檔案格式問題,在 macOS 可以試試 OpenEMU 這套
  • 如何從 PC 傳 ROM 進入 Pi 3 + RetroPie
    • 解法:善用 RetroPie 的環境,可以把 SSH 打開,靠 SCP 或是透過 SAMBA 網路芳鄰進去也很方便
其他動作:
  • 在 https://retropie.org.uk/download/ 下載 Pi 3 作業系統
    • https://github.com/RetroPie/RetroPie-Setup/releases/download/4.6/retropie-buster-4.6-rpi2_rpi3.img.gz
  • 在 macOS command line 連續動作處理(此例 SD Card 位於 /dev/disk4,請不要隨意複製指令執行!)
    • % sudo diskutil unmountDisk /dev/disk4 % unzip retropie-buster-4.6-rpi2_rpi3.img.gz % sudo time dd bs=1m if=retropie-buster-4.6-rpi2_rpi3.img of=/dev/rdisk4 2729+0 records in 2729+0 records out 2861563904 bytes transferred in 506.080069 secs (5654370 bytes/sec) 506.10 real 0.01 user 2.08 sys % sudo diskutil unmountDisk /dev/disk4
  • 當 Pi 3 + RetroPie 啟動後,設定 Wi-fi Country 跟啟動 SSH
    • $ sudo raspi-config
      • Change User Password
      • Localisation Otions
        • Change WI-FI Country
      • Network Options
        • Wi-fi
      • Interfacing Options
        • SSH
      • Update
      • Finish
  • 更新系統以及 RetroPie 眾多資料(模擬器)
    • $ sudo apt update $ sudo apt upgrade $ sudo apt dist-upgrade $ sudo apt autoremove $ sudo apt install tmux vim
    • pi@retropie:~ $ sudo ./RetroPie-Setup/retropie_setup.sh
      • Basic install -> YES
      • Update

2020年5月4日 星期一

重溫超任「三國志3 中文版」

SENS 三國志3 中文版

記得第一次接觸是小學的時候,去幼稚園同學家的遊樂器材店,就這樣初次接觸三國志遊戲。下一次,則是 PC 版的三國志五了!

記得小時候搭配藍截者,有那種重返前一刻狀態的密技,就這樣用新增武將時,用耐心找到單一能力達 100 的員工 XD 此例是君主單純調配能力達到武力 100 ,其餘軍師則是花耐心找到智力 100。

就這樣,配一個君主跟三名武將,從許昌出發,而智力 100 的特色是做事不斷去煩軍師,只要軍師說 ok 就肯定 ok!透過偽書降低對方忠誠度,或是錄用對方都是軍師說好時,一定 100% 成功率的。沒想到這時把玩這款遊戲,一不小心就噴了 3 小時,更讓我想起工作上的瑣事

大概有三件事:

  • 大家特愛當中庸者,什麼都要摸一點,像是能力各個 85 甚至 95,都還不如單一項目專精 100 。單一能力達 100 時,才會進入另一個模式。
  • 單一武將兩個能力很好,不如兩個武將各一個能力好,在這種回合制上,就凸顯出兩個人的好用。例如一個人放偽書,另一個來錄用。因為有時對方身上兵權很重,第一次放偽書,可能下一回合兵權就被去除
  • 數字化,明明很普通的遊戲,卻還是被數字吸引著,養成一種無奈的耐心跟自律,規律地聽著洗腦的背景,時間就消逝了,而成就領地卻增加
這些是恰好跟工作有關,不要當英雄把責任跟任務攬在身上,一個人一天只有 24 小時!要多培養夥伴能力並珍惜單一能力技能很強的夥伴!最後,則是流量變現上持續數據化、遊戲化。

2020年4月27日 星期一

海潮之聲

Untitled

晚上 coding 時,看了一眼 NETFLIX ,看到國高中看過的動畫電影 海潮之聲 ,看著時間才一小時很剛好,就投放到 Chromecast 後,改在電視前面 coding ,也很不錯的在播完前沒多久收尾了 side project。

海潮之聲的故事,說真的記不太得,在看之前,我一直把劇情跟 兒時的點點滴滴 混在一起 XD 雖然我記得著海潮之聲是校園男女故事,但我腦袋裡一直想著海潮之聲有畢業後的同學會,好像在回憶什麼故事似的,看完才發現我真的錯很大 XD 這是一齣很直觀的故事敘述,雖然動畫電影的開頭是個倒敘。

此時此刻,看著這純純的愛情故事,也令人想起跟朋友的交流,記得有位朋友跟我分享起戀情上發生的事,這類通常是屬於訴苦。當時我就分享了我年輕時對於交往的想法,那就像翻開一本書,時而歡樂,時而禁書,又可能是悲傷、開朗的、故作堅強的、萬般神秘的。讓人常常一翻開就背負著一種責任要看完它。

搭配著海潮之聲的劇情發展,真是有所共鳴啊...因為神秘而多問了什麼、因為關心而多付出了什麼,殊不知情感的流露就這般地灑了滿地。

別忘了,要記得學會收個尾囉!

註1:用 NETFLIX 找 海潮 時,不能用兒童角色,這是一部 7+ 動畫電影
註2:在夏天聽原聲帶很應景 - Spotify : The Ocean Waves (Original Soundtrack)

2020年4月24日 星期五

[書] 流量池

Untitled

最初是因為瑞幸咖啡的關係,追了一下 CMO 楊飛經歷,就順手 K 完這本書。

關於瑞幸的故事,可以參考滿多不錯的影片:

【中国商业史09】瑞幸咖啡资本骗局大起底:老板卷走150亿,好兄弟却亏了8000万美金,背后究竟发生了什么?——冲浪普拉斯


CK投資理財|瑞幸咖啡背後的龐氏騙局(看完就全明白了!)|華爾街割韭菜,瑞幸咖啡絕非第一家!


不過,對於 CMO 的貢獻,倒是不可抹滅的。畢竟公司的行銷活動還是扎實的被執行出成績了。

對於這本非常值得番一遍,雖然我自己看得很痛苦 XD

主要是一樣的道理不斷的用其他案例呈述,且經驗多為天時地利人和的八卦屬性,也就是沒那個舞台就算知道了這些經驗,也終將隨著時間而無意義。但只靠一本書,就多看一下別人的眼界,還是很值得的。

最後就把這本書介紹給長輩們翻一翻 XD 恰好有一位長輩對流量變現很感興趣,要我開些書單,結果我亂開 XD 這次看到這本頗有名氣的,既不會太深的技術,也有很多案例,非常適合給未涉入過深此領域的人,嚐鮮一下。