Showing preview only (2,143K chars total). Download the full file or copy to clipboard to get everything.
Repository: makelove/Programer_Log
Branch: master
Commit: 12ee6d18ae36
Files: 309
Total size: 29.3 MB
Directory structure:
gitextract_yt17wx8s/
├── .gitignore
├── 2019/
│ ├── 12-16-Github-Pull-requests-gocolly/
│ │ └── Github-Pull-requests-gocolly.md
│ ├── 12-18-Caddy搭建Google镜像-反向代理/
│ │ └── Caddy搭建Google镜像-反向代理.md
│ ├── 12-26-用docker模拟Nginx限制同一个爬虫ip的访问频率/
│ │ └── 用docker模拟Nginx限制同一个爬虫ip的访问频率.md
│ ├── 12-29-Docker-OpenCV-golang-gocv/
│ │ ├── README.md
│ │ └── facedetect-from-url/
│ │ ├── facedetect
│ │ └── main.go
│ ├── 12-30-Docker-Puppeteer抓取动态页面/
│ │ ├── README.md
│ │ └── puppeteer/
│ │ └── docker-puppeteer-pdf.js
│ └── 12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/
│ ├── README.md
│ └── docker-h5.js
├── 2020/
│ ├── 1-19-TTS语音合成/
│ │ ├── README.md
│ │ └── 讯飞语音/
│ │ ├── config.py
│ │ ├── tts_ws_python3_demo.py
│ │ └── xf_service.py
│ ├── 1-20-hacker-tools/
│ │ └── README.md
│ ├── 1-3-特朗普-推特-截图/
│ │ ├── README.md
│ │ └── twitter_screenshot1.js
│ ├── 10-9-weShare-ink-display/
│ │ └── README.md
│ ├── 11-25-use-Search-engine/
│ │ └── README.md
│ ├── 12-17-Azure-server-free/
│ │ └── README.md
│ ├── 12-19-password-generator/
│ │ ├── README.md
│ │ └── password.py
│ ├── 12-21-python-hosts/
│ │ ├── README.md
│ │ └── add-host-ip.py
│ ├── 12-21-requests-toolbelt/
│ │ └── README.md
│ ├── 12-22-PyGithub/
│ │ └── README.md
│ ├── 12-4-chrome-enable-network-request-blocking/
│ │ └── README.md
│ ├── 12-5-flask-ffmpeg-m3u8/
│ │ └── README.md
│ ├── 2-1-WordCloud-武汉/
│ │ ├── README.md
│ │ ├── 词云-Alice-英文.ipynb
│ │ └── 词云wordcloud-中文.ipynb
│ ├── 2-12-Elasticsearch-Chrome/
│ │ ├── README.md
│ │ └── 分词.md
│ ├── 2-13-微博实时抓取/
│ │ └── README.md
│ ├── 2-17-Python-secrets/
│ │ └── README.md
│ ├── 2-18-Docker-Go-goProxy/
│ │ └── README.md
│ ├── 2-18-Scrapy-auto-proxy/
│ │ ├── README.md
│ │ └── manage_proxy.py
│ ├── 2-19-JetBrains-Pycharm-破解/
│ │ ├── README.md
│ │ └── demo/
│ │ ├── .vscode/
│ │ │ └── launch.json
│ │ ├── demo.py
│ │ ├── go.mod
│ │ └── t1.go
│ ├── 2-20-Python-Siri-语音朗读文章/
│ │ ├── Global-hotkeys.py
│ │ ├── README.md
│ │ ├── copy-string-tts.py
│ │ ├── copy-string-tts2.py
│ │ └── keyboard_Listener1.py
│ ├── 2-22-Scrapy-Puppeteer-Js/
│ │ ├── README.md
│ │ ├── demo/
│ │ │ ├── demo/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── items.py
│ │ │ │ ├── middlewares.py
│ │ │ │ ├── pipelines.py
│ │ │ │ ├── settings.py
│ │ │ │ └── spiders/
│ │ │ │ ├── __init__.py
│ │ │ │ └── example.py
│ │ │ ├── main.py
│ │ │ └── scrapy.cfg
│ │ ├── docker-puppeteer-index.js
│ │ ├── index.html
│ │ ├── js_server.go
│ │ ├── js_server.py
│ │ └── templates/
│ │ └── index.html
│ ├── 2-23-压力测试-locust/
│ │ ├── README.md
│ │ ├── locust-get.py
│ │ ├── locust_file.py
│ │ └── server.go
│ ├── 2-24-Go-Module/
│ │ ├── README.md
│ │ └── demo/
│ │ ├── a
│ │ ├── a.go
│ │ ├── a2.go
│ │ ├── dir1/
│ │ │ ├── b.go
│ │ │ ├── b2.go
│ │ │ └── dir11/
│ │ │ └── b11.go
│ │ ├── dir2d/
│ │ │ ├── d2.go
│ │ │ └── d21.go
│ │ └── go.mod
│ ├── 2-26-Go_Proxy_server/
│ │ ├── README.md
│ │ ├── go.mod
│ │ ├── proxy_server
│ │ └── proxy_server.go
│ ├── 2-26-多点签到领积分/
│ │ ├── README.md
│ │ ├── demo1.py
│ │ ├── 多点-签到-抓包.txt
│ │ └── 多点-领取奖励-抓包.txt
│ ├── 2-29-Docker-WeChat/
│ │ └── README.md
│ ├── 2-3-Chrome-extensions/
│ │ ├── README.md
│ │ ├── content_scripts和background的消息传递.md
│ │ └── 参考.md
│ ├── 2-4-App-Store/
│ │ ├── 怎样做一个像 【七麦数据】那样的网站.txt
│ │ └── 苹果 接口 node-js.txt
│ ├── 2-5-Go语言入门/
│ │ └── README.md
│ ├── 2-5-TTS-Moviepy/
│ │ ├── README.md
│ │ └── TTS/
│ │ ├── Install.txt
│ │ ├── config.py
│ │ ├── xf_service.py
│ │ └── 语音合成自动视频.ipynb
│ ├── 2-6-BT_Torrent/
│ │ └── README.md
│ ├── 2-6-Spider-Speed-test/
│ │ ├── README.md
│ │ ├── go_spider
│ │ ├── go_spider.go
│ │ ├── scrapy_demo/
│ │ │ ├── README.md
│ │ │ ├── scrapy.cfg
│ │ │ └── scrapy_demo/
│ │ │ ├── __init__.py
│ │ │ ├── items.py
│ │ │ ├── middlewares.py
│ │ │ ├── middlewares_proxy_redis.py
│ │ │ ├── pipelines.py
│ │ │ ├── settings.py
│ │ │ └── spiders/
│ │ │ ├── __init__.py
│ │ │ └── example.py
│ │ ├── server
│ │ └── server.go
│ ├── 2-6-gocolly/
│ │ └── README.md
│ ├── 2-7-Docker-Nginx-antiClawer/
│ │ ├── README.md
│ │ ├── deny_userAgent.conf
│ │ ├── go_spider
│ │ ├── go_spider.go
│ │ ├── nginx1.conf
│ │ └── server.go
│ ├── 2-9-Chrome插件-全文检索/
│ │ └── README.md
│ ├── 3-1-世界语言-翻译-Siri朗读/
│ │ ├── README.md
│ │ ├── baidu_translate_api.py
│ │ ├── config.py
│ │ ├── macOS-siri-百度翻译-TTS.py
│ │ └── py-调用macos内置的语音听写功能.py
│ ├── 3-10-nonebot_Coolq_Docker/
│ │ └── README.md
│ ├── 3-13-macOS-lock-screen/
│ │ ├── README.md
│ │ ├── lockscreen.py
│ │ └── suspend.py
│ ├── 3-14-DNS查询/
│ │ └── README.md
│ ├── 3-14-时间管理/
│ │ └── README.md
│ ├── 3-16-GitHub-Free/
│ │ ├── README.md
│ │ ├── proxy_list1
│ │ ├── proxy_list1.py
│ │ └── verify_proxy.py
│ ├── 3-16-企业微信/
│ │ ├── QYWX_APP/
│ │ │ ├── WXBizMsgCrypt.py
│ │ │ ├── callback1.py
│ │ │ ├── config.py
│ │ │ ├── ierror.py
│ │ │ └── 安装.md
│ │ ├── README.md
│ │ └── bot1.py
│ ├── 3-17-Auto.js/
│ │ ├── Programer-Pay-Solution.md
│ │ ├── README.md
│ │ ├── 微信/
│ │ │ ├── 微信-收款码-输入金额-备注.js
│ │ │ ├── 微信-收款码-输入金额-捕捉toast.js
│ │ │ ├── 微信-收款码-输入金额.js
│ │ │ ├── 微信1.js
│ │ │ └── 收款码.js
│ │ └── 打开QQ聊天.js
│ ├── 3-18-Docker-PHP-dataoke/
│ │ ├── PHP/
│ │ │ ├── README.md
│ │ │ └── nginx/
│ │ │ ├── conf/
│ │ │ │ └── conf.d/
│ │ │ │ └── php.conf
│ │ │ └── www/
│ │ │ ├── index.html
│ │ │ ├── index.php
│ │ │ └── phpinfo.php
│ │ └── README.md
│ ├── 3-18-raspberry-pi-VScode/
│ │ ├── README.md
│ │ └── request-ip.py
│ ├── 3-2-Wikipedia/
│ │ └── README.md
│ ├── 3-20-keyboard-man/
│ │ └── README.md
│ ├── 3-23-douban-movie-chrome-extension/
│ │ ├── README.md
│ │ └── extension/
│ │ ├── _locales/
│ │ │ ├── en/
│ │ │ │ └── messages.json
│ │ │ └── zh_CN/
│ │ │ └── messages.json
│ │ ├── css/
│ │ │ └── tab.css
│ │ ├── js/
│ │ │ ├── background.js
│ │ │ └── content.js
│ │ └── manifest.json
│ ├── 3-24-macOS-Python-Notification/
│ │ ├── README.md
│ │ ├── bili_status_number.py
│ │ └── macos_notify.py
│ ├── 3-25-git-sourcetree-Fork/
│ │ └── README.md
│ ├── 3-26-m3u8-decrypt/
│ │ └── README.md
│ ├── 3-28-Python反向编程/
│ │ ├── README.md
│ │ └── demo.py
│ ├── 3-29-Chrome-History/
│ │ └── README.md
│ ├── 3-30-程序员-邮件订阅/
│ │ └── README.md
│ ├── 3-31-python-smart-device/
│ │ ├── README.md
│ │ ├── broadlink1.py
│ │ ├── 广播1.py
│ │ └── 监听1.py
│ ├── 3-4-WireShark-https-Decrypt/
│ │ └── README.md
│ ├── 3-5-Python-Request-https-with-proxy/
│ │ ├── README.md
│ │ ├── verify_https.go
│ │ └── verify_https.py
│ ├── 3-5-Ubuntu-install-Wine-run-Windows/
│ │ └── README.md
│ ├── 3-6-macOS创建输入法/
│ │ ├── README.md
│ │ ├── bili_utf16.inputplugin
│ │ └── mac_canton_utf16.inputplugin
│ ├── 3-7-web-proxy/
│ │ ├── README.md
│ │ ├── demo1.py
│ │ └── demo2.py
│ ├── 3-9-DNS-server/
│ │ ├── README.md
│ │ ├── dns_flask.py
│ │ └── mini_dns_server.go
│ ├── 4-1-mitmproxy-抖音/
│ │ └── README.md
│ ├── 4-10-MCN-papi酱/
│ │ ├── README.md
│ │ └── analysis.py
│ ├── 4-2-今日头条-原创视频-收益/
│ │ └── README.md
│ ├── 4-23-moviepy-GIF/
│ │ ├── README.md
│ │ └── 跳绳-GIF动画.ipynb
│ ├── 4-23-程小奔python/
│ │ ├── README.md
│ │ └── 检测物体.py
│ ├── 4-29-GoPro-MAX/
│ │ └── README.md
│ ├── 4-3-Jupiter-Notebook-插入HTML视频/
│ │ ├── README.md
│ │ └── html_video.ipynb
│ ├── 4-8-instagram/
│ │ └── README.md
│ ├── 5-4-movie-调查犯罪是我们的职业/
│ │ ├── Crime est notre affaire.subs.cn.srt
│ │ ├── Crime est notre affaire.subs.eng.srt
│ │ └── README.md
│ ├── 6-17-Bird-Sound-crawl/
│ │ ├── README.md
│ │ ├── data.py
│ │ ├── download_sound.py
│ │ ├── sound_proxy.py
│ │ └── sounds/
│ │ └── download.ams.birds.cornell.edu/
│ │ └── api/
│ │ └── v1/
│ │ └── asset/
│ │ ├── 108015/
│ │ │ └── audio
│ │ └── 109243711/
│ │ └── audio
│ ├── 6-17-EXIF-GPS/
│ │ ├── README.md
│ │ └── exif-gps.py
│ ├── 6-22-iPad-Draw-on-Map/
│ │ └── README.md
│ └── 7-30-PDF-decrypt/
│ ├── README.md
│ ├── pdf_decrypt.py
│ └── pdf_unlock.go
├── 2021/
│ ├── 1-19-macOS-Window-On-Top/
│ │ └── README.md
│ ├── 1-24-desert-forest-destroyed/
│ │ └── README.md
│ ├── 1-27-server-psutil/
│ │ ├── README.md
│ │ └── server_report.py
│ ├── 1-31-scapy-graph-svg/
│ │ ├── Graphviz/
│ │ │ ├── dot/
│ │ │ │ └── test.dot
│ │ │ └── 生成动态路由轨迹图.ipynb
│ │ └── README.md
│ ├── 1-4-bilibili_api/
│ │ └── README.md
│ ├── 1-5-github-markdown-html/
│ │ ├── README.md
│ │ └── repo_markdown_html1.py
│ ├── 2-23-great-code/
│ │ └── README.md
│ ├── 2-24-movie-cut/
│ │ └── README.md
│ ├── 2-28-GitHub-short-link/
│ │ ├── README.md
│ │ ├── push_qrcode1.py
│ │ └── short_link1.py
│ ├── 3-13-chrome-book/
│ │ └── README.md
│ ├── 3-15-wallpaper/
│ │ ├── README.md
│ │ └── 壁纸/
│ │ ├── README.MD
│ │ ├── goWP.go
│ │ ├── wp1.go
│ │ ├── wp1.py
│ │ ├── wp2.go
│ │ └── wp_macos
│ ├── 3-17-VMagicMirror/
│ │ └── README.md
│ ├── 3-19-Chrome-tabs/
│ │ ├── README.md
│ │ └── TabGroups-shortcuts/
│ │ ├── README.md
│ │ ├── background.js
│ │ ├── hello.html
│ │ └── manifest.json
│ ├── 3-21-subtitle-rejust/
│ │ ├── README.md
│ │ ├── cn2.srt
│ │ ├── jl1.py
│ │ ├── 从网站下载的简体.srt
│ │ ├── 从视频分离的字幕.srt
│ │ └── 调整后.srt
│ ├── 3-7-m3u8-chrome/
│ │ ├── README.md
│ │ ├── ffmpeg1.py
│ │ └── youku1.py
│ ├── 5-30-SMS-api/
│ │ ├── README.md
│ │ └── sms_server.py
│ ├── 5-30-puppeteer-REPL/
│ │ ├── README.md
│ │ └── 在命令行里REPL/
│ │ ├── DEMO.JS
│ │ ├── debug.js
│ │ └── puppeteer-extra-plugin-repl.js
│ ├── 6-19-list-groupby/
│ │ ├── README.md
│ │ └── groupby.py
│ ├── 7-11-Flask-Pydantic/
│ │ ├── README.md
│ │ ├── fastapi_pydantic1.py
│ │ └── flask_pydantic1.py
│ ├── 7-25-Lorca/
│ │ ├── README.MD
│ │ └── examples/
│ │ ├── counter/
│ │ │ ├── Example.app/
│ │ │ │ └── Contents/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MacOS/
│ │ │ │ │ └── lorca-example
│ │ │ │ └── Resources/
│ │ │ │ └── icon.icns
│ │ │ ├── build-linux.sh
│ │ │ ├── build-macos.sh
│ │ │ ├── build-windows.bat
│ │ │ ├── counter_win10
│ │ │ ├── go.mod
│ │ │ ├── go.sum
│ │ │ ├── icons/
│ │ │ │ └── icon.icns
│ │ │ ├── main.go
│ │ │ └── www/
│ │ │ └── index.html
│ │ ├── hello/
│ │ │ ├── hello_win10
│ │ │ ├── main.go
│ │ │ └── main_macOS
│ │ └── stopwatch/
│ │ ├── main.go
│ │ ├── main_macOS
│ │ └── stopwatch_win10
│ ├── 7-4-diskcache/
│ │ ├── README.md
│ │ └── diskcache1.py
│ ├── 8-1-deta-fastapi/
│ │ └── README.md
│ ├── 8-15-Marp-ppt/
│ │ ├── README.MD
│ │ ├── README.html
│ │ ├── demo-完成.html
│ │ ├── demo-完成.md
│ │ ├── demo-完成2.html
│ │ ├── demo-完成3.html
│ │ ├── demo-完成4.html
│ │ ├── demo-完成5.html
│ │ ├── demo-完成6.html
│ │ └── demo.md
│ └── 9-3-Deta-Base/
│ ├── BaseDemo/
│ │ ├── config.py
│ │ ├── main.py
│ │ └── requirements.txt
│ └── README.md
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# new
.idea
.DS_Store
================================================
FILE: 2019/12-16-Github-Pull-requests-gocolly/Github-Pull-requests-gocolly.md
================================================
- 使用gocolly爬虫,想统计抓取情况发现不方便,所以自己修改colly.go写了一个方法Statistics
- https://github.com/gocolly/colly/issues/411
- 参考
- [git学习--GitHub上如何进行PR(Pull Request)操作](https://blog.csdn.net/qq_33429968/article/details/62219783)
- PR步骤
```shell script
#首先fork gocolly 到自己的GitHub
# 然后clone到本地
(.py3) pro:github play$ mkdir PR
(.py3) pro:github play$ cd PR
(.py3) pro:PR play$ git clone git@github.com:makelove/colly.git
Cloning into 'colly'...
remote: Enumerating objects: 130, done.
remote: Counting objects: 100% (130/130), done.
remote: Compressing objects: 100% (97/97), done.
remote: Total 1797 (delta 33), reused 52 (delta 8), pack-reused 1667
Receiving objects: 100% (1797/1797), 8.16 MiB | 43.00 KiB/s, done.
Resolving deltas: 100% (955/955), done.
(.py3) pro:PR play$
(.py3) pro:PR play$ ls
. .. colly
(.py3) pro:PR play$ cd colly/
#与 https://github.com/gocolly/colly 建立链接
(.py3) pro:colly play$ git remote -v
origin git@github.com:makelove/colly.git (fetch)
origin git@github.com:makelove/colly.git (push)
(.py3) pro:colly play$ git remote add upstream https://github.com/gocolly/colly.git
(.py3) pro:colly play$ git remote -v
origin git@github.com:makelove/colly.git (fetch)
origin git@github.com:makelove/colly.git (push)
upstream https://github.com/gocolly/colly.git (fetch)
upstream https://github.com/gocolly/colly.git (push)
#建立分支
(.py3) pro:colly play$ git branch
* master
(.py3) pro:colly play$ git checkout -b Statistics
Switched to a new branch 'Statistics'
(.py3) pro:colly play$ git branch
* Statistics
master
#修改代码
(.py3) pro:colly play$ sub .
#提交代码
(.py3) pro:colly play$ git status
On branch Statistics
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: colly.go
no changes added to commit (use "git add" and/or "git commit -a")
(.py3) pro:colly play$ git add colly.go
(.py3) pro:colly play$ git commit -m "add Statistics function to colly.Collector"
[Statistics fe0f649] add Statistics function to colly.Collector
1 file changed, 12 insertions(+)
(.py3) pro:colly play$ git status
On branch Statistics
nothing to commit, working tree clean
(.py3) pro:colly play$ git push
fatal: The current branch Statistics has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin Statistics
(.py3) pro:colly play$ git push --set-upstream origin Statistics
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 466 bytes | 466.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote:
remote: Create a pull request for 'Statistics' on GitHub by visiting:
remote: https://github.com/makelove/colly/pull/new/Statistics
remote:
To github.com:makelove/colly.git
* [new branch] Statistics -> Statistics
Branch 'Statistics' set up to track remote branch 'Statistics' from 'origin'.
```
- 在https://github.com/makelove/colly/pulls 创建 Pull requests
- 检查代码
- 提交
================================================
FILE: 2019/12-18-Caddy搭建Google镜像-反向代理/Caddy搭建Google镜像-反向代理.md
================================================
- 官网
- https://github.com/caddyserver/caddy
- 下载 https://caddyserver.com/v1/download
- 视频 https://www.bilibili.com/video/av79726017/
- 参考
- [caddy 搭建google 镜像,很容易](https://www.banwagongzw.com/33.html)
- 安装脚本
- https://github.com/ToyoDAdoubi/doubi/blob/master/caddy_install.sh
- 视频
- [Caddy搭建Google镜像-反向代理](https://www.bilibili.com/video/av79726017/)
- 配置
- 最后在Chrome浏览器安装扩展【[删除谷歌重定向](https://github.com/kodango/Remove-Google-Redirection)】
- Chrome 网上应用店 https://chrome.google.com/webstore/detail/dnhjklgpiifbofihffldllbcopkinlod
```shell script
(.py3) localhost:caddy_v1.0.4_linux_amd64 play$ cat Caddyfile
:80 {
gzip
proxy / https://www.baidu.com
}
#执行
sudo ./caddy -conf ./Caddyfile
```
- 调试
- 镜像HTTPS网站
- ./caddy -host baidu.com -port 8080
- 可能SSL证书获取失败
## 还需要买一个服务器
- 国外
- [vultr](https://www.vultr.com/?ref=8349543)
================================================
FILE: 2019/12-26-用docker模拟Nginx限制同一个爬虫ip的访问频率/用docker模拟Nginx限制同一个爬虫ip的访问频率.md
================================================
# 用docker模拟Nginx限制同一个爬虫ip的访问频率
- Nginx配置
https://blog.csdn.net/weixin_34341117/article/details/85848963
使用golang的tollbooth模块代替
https://github.com/didip/tollbooth
- Docker
1.启动busybox
docker run -it -p 84:4000 --volume /Users/play/CODE/GO/HTTP请求限流/tollbooth1:/go busybox
cd /go/
/go # ./demo3_linux
网址
curl http://192.168.0.111:84/ip
查看IP
docker exec -it container1 ip addr
172.17.0.2
2.启动代理
docker run -it -p 3129:3128 --name=squid3 datadog/squid
测试
curl -x localhost:3129 http://172.17.0.2:4000/ip
3.批量测试
```shell script
#!/bin/bash
for((i=1;i<=10;i++));
do
curl -x localhost:3129 http://172.17.0.2:4000/ip ;
echo ""
echo "-------"
done
```
4. Python测试
```python
import requests
from time import sleep
url='http://172.17.0.2:4000/ip'
proxies = {
"http": "http://localhost:3129",
"https": "http://localhost:3129",
}
for i in range(200):
rs=requests.get(url,proxies=proxies)
print(rs.status_code,rs.text)
if rs.status_code==429:
sleep(0.3)
```
================================================
FILE: 2019/12-29-Docker-OpenCV-golang-gocv/README.md
================================================
# 使用docker运行OpenCV+golang
- 参考
- https://github.com/hybridgroup/gocv
- https://hub.docker.com/r/hybridgroup/gocv
- 结论
- docker+gocv 可以作为服务器程序,在服务器上高速执行
- 首先 pull docker
- docker pull hybridgroup/gocv
- 运行后
- 发现golang版本太低,不能执行代码,需要升级
下载 go1.13.3.linux-amd64.tar.gz
https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz 不行
https://studygolang.com/dl/golang/go1.13.3.linux-amd64.tar.gz
docker run -it -v /Users/play/github/gocv:/gocv hybridgroup/gocv
进入后,解压,即可
```shell script
1 cd /gocv/
2 rm -rf /usr/local/go
3 tar -C /usr/local -xzf go1.13.3.linux-amd64.tar.gz
4 go version
```
退出
```shell script
(.py3) pro:~ play$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2dc43cabe71 hybridgroup/gocv "/bin/bash" 12 minutes ago Exited (0) 2 seconds ago hopeful_lehmann
ec9d94cacbe1 pypy:3.6 "pypy3" 16 hours ago Exited (0) 16 hours ago admiring_vaughan
#将容器打包成一个新的镜像
(.py3) pro:~ play$ docker commit f2dc43cabe71 gocv:go1.13
sha256:033be3d5044d7f84ff552255e0c7f3d1da7c92d3a462342d37799b3f02f519fa
(.py3) pro:~ play$ docker image ls |grep gocv
gocv go1.13 033be3d5044d 16 seconds ago 1.5GB
hybridgroup/gocv latest f236ffa190b7 7 weeks ago 1.14GB
#测试
docker run -it -v /Users/play/github/gocv:/gocv gocv:go1.13
root@d7b692fdda37:/gocv/cmd/version# go run main.go
gocv version: 0.21.0
opencv lib version: 4.0.1
root@d7b692fdda37:/gocv/cmd/version# go version
go version go1.13.3 linux/amd64
```
- 执行脸部识别程序
```shell script
root@d7b692fdda37:/gocv/cmd/facedetect# cd /gocv/cmd/facedetect-from-url/
root@d7b692fdda37:/gocv/cmd/facedetect-from-url# go build -o facedetect main.go
root@d7b692fdda37:/gocv/cmd/facedetect-from-url# ll -h
total 8.3M
drwxr-xr-x 4 root root 128 Jan 1 03:36 ./
drwxr-xr-x 30 root root 960 Dec 2 10:39 ../
-rwxr-xr-x 1 root root 8.3M Jan 1 03:36 facedetect*
-rw-r--r-- 1 root root 1.9K Dec 2 11:04 main.go
root@d7b692fdda37:/gocv/cmd/facedetect-from-url# ./facedetect
How to run:
facedetect-from-url [image URL] [classifier XML file] [image file]
root@d7b692fdda37:/gocv/cmd/facedetect-from-url# ./facedetect https://raw.githubusercontent.com/hybridgroup/gocv/master/images/face.jpg ../../data/haarcascade_frontalface_default.xml output2.jpg
[./facedetect https://raw.githubusercontent.com/hybridgroup/gocv/master/images/face.jpg ../../data/haarcascade_frontalface_default.xml output2.jpg]
Get(imageURL)
found 1 faces
saved to output2.jpg
root@d7b692fdda37:/gocv/cmd/facedetect-from-url# ll -h
total 8.3M
drwxr-xr-x 5 root root 160 Jan 1 03:38 ./
drwxr-xr-x 31 root root 992 Jan 1 03:38 ../
-rwxr-xr-x 1 root root 8.3M Jan 1 03:36 facedetect*
-rw-r--r-- 1 root root 1.9K Dec 2 11:04 main.go
-rw-r--r-- 1 root root 39K Jan 1 03:38 output2.jpg
```
- 大问题:不能编译跨平台程序,因为OpenCV
- 在Linux编译macOS程序
```shell script
root@d7b692fdda37:/gocv/cmd/showimage# CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# gocv.io/x/gocv
/gocv/dnn_ext.go:9:28: undefined: Mat
/gocv/dnn_ext.go:16:12: undefined: NewMatWithSize
/gocv/dnn_ext.go:42:2: undefined: Resize
/gocv/dnn_ext.go:42:38: undefined: InterpolationDefault
/gocv/dnn_ext.go:45:3: undefined: CvtColor
/gocv/dnn_ext.go:48:15: undefined: NewMat
/gocv/dnn_ext.go:51:31: undefined: MatTypeCV32F
```
================================================
FILE: 2019/12-29-Docker-OpenCV-golang-gocv/facedetect-from-url/main.go
================================================
// What it does:
//
// This example uses the CascadeClassifier class to detect faces from url,
// and draw a rectangle around each of them, before displaying them within a Window.
//
// How to run:
//
// facedetect-from-url [image URL] [classifier XML file] [image file]
//
// go run ./cmd/facedetect-from-url/main.go https://raw.githubusercontent.com/hybridgroup/gocv/master/images/face.jpg data/haarcascade_frontalface_default.xml output.jpg
//
// +build example
package main
import (
"fmt"
"image"
"image/color"
"io/ioutil"
"log"
"net/http"
"os"
"gocv.io/x/gocv"
)
func main() {
if len(os.Args) < 4 {
fmt.Println("How to run:\n\tfacedetect-from-url [image URL] [classifier XML file] [image file]")
return
}
// parse args
imageURL := os.Args[1]
xmlFile := os.Args[2]
saveFile := os.Args[3]
fmt.Println(os.Args)
// color for the rect when faces detected
blue := color.RGBA{0, 0, 255, 0}
// load classifier to recognize faces
classifier := gocv.NewCascadeClassifier()
defer classifier.Close()
if !classifier.Load(xmlFile) {
fmt.Printf("Error reading cascade file: %v\n", xmlFile)
return
}
// get image from URL
res, err := http.Get(imageURL)
if err != nil {
log.Fatal(err)
}
println("Get(imageURL)")
resByte, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
img, err := gocv.IMDecode(resByte, 1)
if err != nil {
log.Fatal(err)
}
rects := classifier.DetectMultiScale(img)
fmt.Printf("found %d faces\n", len(rects))
// draw a rectangle around each face on the original image,
// along with text identifing as "Human"
for _, r := range rects {
gocv.Rectangle(&img, r, blue, 3)
size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2)
pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2)
gocv.PutText(&img, "Human", pt, gocv.FontHersheyPlain, 1.2, blue, 2)
}
gocv.IMWrite(saveFile, img)
fmt.Printf("saved to %s\n", saveFile)
}
================================================
FILE: 2019/12-30-Docker-Puppeteer抓取动态页面/README.md
================================================
# Docker+Puppeteer抓取动态页面
- 视频 https://www.bilibili.com/video/av81253564/
### 问题
爬虫怎样抓取Js动态页面?例如电商网站的价格,销量
## 常规解决方案
安装firefox selenium python
- 问题
- 1 安装麻烦,配置麻烦
- 2 本地配置好了,不方便部署到服务器
- 3 效率低下
## 解决
Docker+Puppeteer(Chrome headless node API)
1. 自定义脚本
- https://hub.docker.com/r/alekzonder/puppeteer
- 下载
- docker pull alekzonder/puppeteer
- 运行
- docker run --shm-size 1G --rm -v /Users/play/Temp/puppeteer/docker-puppeteer-pdf.js:/app/index.js -v /Users/play/Temp/puppeteer:/puppeteer alekzonder/puppeteer:latest
- 查看PDF
2. 渲染中间件-动态网页
- https://hub.docker.com/r/zenato/puppeteer-renderer
- 源代码 https://github.com/zenato/puppeteer-renderer
- 运行
- docker run -it --name renderer -p 8080:3000 zenato/puppeteer-renderer
- 测试
- curl http://localhost:8080/?url=https://ip.cn/
## Scrapy 爬虫 抓取Js动态页面
- 参考 [scrapy如何在中间件修改请求url](https://blog.csdn.net/wang785994599/article/details/97887294)
- 在middlewares.py编写中间件
```
from urllib.parse import quote
class Puppeteer(object):
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls(crawler)
# crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def __init__(self, crawler):
self.host = 'http://localhost:8080/?url='
def process_request(self, request, spider):
request.meta['url'] = request.url
url = self.host + quote(request.url)
request._set_url(url)
pass
def process_response(self, request, response, spider):
response._set_url(request.meta['url'])
return response
pass
```
- 在settings.py 加入
```
DOWNLOADER_MIDDLEWARES = {
'demo.middlewares.Puppeteer': 543,
}
```
- 缺点
- 不能更改Puppeteer的UserAgent ?!!
- 只能修改index.js 源代码
================================================
FILE: 2019/12-30-Docker-Puppeteer抓取动态页面/puppeteer/docker-puppeteer-pdf.js
================================================
/*
运行
docker run --shm-size 1G --rm -v /Users/play/Temp/puppeteer/docker-puppeteer-pdf.js:/app/index.js -v /Users/play/Temp/puppeteer:/puppeteer alekzonder/puppeteer:latest
*/
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox'
]
});
const page = await browser.newPage();
await page.goto('https://ip.cn/');
await page.waitFor(2000)
await page.pdf({path: '/puppeteer/example.pdf'});
await browser.close();
})();
================================================
FILE: 2019/12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/README.md
================================================
# 12-31-Ubuntu-docker-puppeteer-刷B站视频播放量
- 首先在Ubuntu服务器上安装docker.io
- 参考 https://docs.docker.com/install/linux/docker-ce/ubuntu/
- 先更新apt缓存
- sudo apt-get update
- 添加key
- 添加repo
- 更新apt缓存
- sudo apt-get update
- 安装
- sudo apt-get install docker-ce docker-ce-cli containerd.io
- 测试
- sudo docker run hello-world
- 拉取镜像
- sudo docker pull alekzonder/puppeteer
- 上传js脚本
- docker-h5.js
- 运行测试
- sudo docker run --shm-size 1G --name bili -v /home/play/WORK/puppeteer/docker-h5.js:/app/index.js alekzonder/puppeteer:latest
- 服务器定时运行
- sudo crontab -e
- 3 */2 * * * docker start bili
- 每隔2小时执行
================================================
FILE: 2019/12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/docker-h5.js
================================================
/**
* Created by play on 2019/8/24.
先安装node
再运行
npm install -g puppeteer
然后
node docker-h5.js
Docker运行
docker rm bili
docker run --shm-size 1G --name bili -v /Users/play/CODE/B站刷视频/docker-h5.js:/app/index.js alekzonder/puppeteer:latest
docker run --shm-size 1G --name bili -v /home/play/WORK/puppeteer/docker-h5.js:/app/index.js alekzonder/puppeteer:latest
*/
Array.prototype.shuffle = function () {
let m = this.length, i;
while (m) {
i = (Math.random() * m--) >>> 0;
[this[m], this[i]] = [this[i], this[m]]
}
return this;
}
const puppeteer = require('puppeteer');
const main_url = 'https://space.bilibili.com/180948619/video'
const main_url2 = 'https://space.bilibili.com/180948619/video?page=2'
const main_url3 = 'https://space.bilibili.com/180948619/video?page=3'
var browser
var sel = '#bilibiliPlayer > div.bilibili-player-area.video-state-pause.video-control-show.video-state-blackside > div.bilibili-player-video-wrap > div.bilibili-player-video > video'
sel ='div.player-box > div'
// var sel2='div.bilibili-player-video'
var urls = []
async function on_response(response) {
// console.log('response url', response.url())
let url = response.url()
if (url.indexOf('arc/search') > 0) {
// let page2 = await browser.newPage();
// await page2.setViewport({width: 1280, height: 800})
// await page._client.send('Network.clearBrowserCookies')//TODO
console.log('response url:', url)
let text = await response.text()
// console.log(text);
let js = JSON.parse(text)
for (let vd of js["data"]["list"]["vlist"]) {
// console.log(vd)
let url = 'https://www.bilibili.com/video/av' + vd["aid"]
console.log(url)
urls.push(url)
console.log('---------')
continue
}
}
}
async function run() {
//const browser = await puppeteer.launch();
browser = await puppeteer.launch({
// headless: false,
timeout: 20000,
DefaultArgs:'--mute-audio',
ignoreDefaultArgs: ['--enable-automation'],
// executablePath: '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome',//可注销
//也可以改为你系统里Chrome的目录
args: [
'--no-sandbox',
'--disable-setuid-sandbox'
]
});
const page = await browser.newPage();
page.on('response', on_response)
const client = await page.target().createCDPSession();
await page.setViewport({width: 1280, height: 800})
console.log("page.goto(main_url)")
await page.goto(main_url)
console.log("page.waitFor(10000)")
await page.waitFor(10000)
// await page.goto(main_url2)//翻页
// await page.waitFor(15000)
// await page.goto(main_url3)//翻页
// await page.waitFor(10000)
// let url = 'https://www.bilibili.com/video/av56212181'
//urls.length > 20
urls=urls.slice(0,10)
urls.shuffle()
console.log('urls len:', urls.length)
await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1');
for (let url of urls) {
// let page2 = await browser.newPage();
// await page2.setViewport({width: 1280, height: 800})
try {
console.log("clearBrowserCookies")
await client.send('Network.clearBrowserCookies');
await page.goto(url)
await page.waitFor(6000);
let title=await page.title()
console.log('open url:', url,title)
await page.click(sel)
console.log("page.click('video')")
await page.waitFor(10000);
// await page.close()
// await page2.waitFor(6000);
} catch (err) {
console.log(err)
}
}
await page.waitFor(20000);
// setTimeout()
browser.close();
console.log("Finished",new Date())
}
run();
================================================
FILE: 2020/1-19-TTS语音合成/README.md
================================================
## TTS 从文本到语音(TextToSpeech) 语音合成
- 视频 [想要鬼畜素材,【TTS语音合成】来帮你,哈哈哈](https://www.bilibili.com/video/av84082965)
- macos say
使用文档
man say
- 命令行
- say 'TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。'
- 保存为文件
- say 'TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。' -o tts.aiff
- 转成mp3
- brew install lame
- lame -m m tts.aiff tts.mp3
- 发音人
【系统偏好设置】>>【辅助功能】>>【语音】
2. 更好的发音系统,更多选择
- 讯飞语音
https://www.xfyun.cn/services/online_tts
- 文档
https://www.xfyun.cn/doc/tts/online_tts/API.html
demo代码写得很烂
不方便使用,需要重写
================================================
FILE: 2020/1-19-TTS语音合成/讯飞语音/config.py
================================================
# -*- coding: utf-8 -*-
# @Time : 2020-01-18 20:29
# @File : config.py
"""
config.py:
"""
APPID = 'xxx'
APIKey = 'xxxxxx'
APISecret = 'xxxxxx'
================================================
FILE: 2020/1-19-TTS语音合成/讯飞语音/tts_ws_python3_demo.py
================================================
# -*- coding:utf-8 -*-
#
# 播放 /Applications/VLC.app/Contents/MacOS/VLC --demux=rawaud --rawaud-channels 1 --rawaud-samplerate 16000 demo.pcm
# 转换格式 ffmpeg -y -f s16be -ar 16000 -acodec pcm_s16le -i demo2.pcm demo22.mp3
# author: iflytek
#
# 本demo测试时运行的环境为:Windows + Python3.7
# 本demo测试成功运行时所安装的第三方库及其版本如下:
# cffi==1.12.3
# gevent==1.4.0
# greenlet==0.4.15
# pycparser==2.19
# six==1.12.0
# websocket==0.2.1
# websocket-client==0.56.0
# 合成小语种需要传输小语种文本、使用小语种发音人vcn、ent=mtts、tte=unicode以及修改文本编码方式
# 错误码链接:https://www.xfyun.cn/document/error-code (code返回错误码时必看)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import websocket
import datetime
import hashlib
import base64
import hmac
import json
from urllib.parse import urlencode
import time
import ssl
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime
import _thread as thread
import os
import wave
STATUS_FIRST_FRAME = 0 # 第一帧的标识
STATUS_CONTINUE_FRAME = 1 # 中间帧标识
STATUS_LAST_FRAME = 2 # 最后一帧的标识
class Ws_Param(object):
# 初始化
def __init__(self, APPID, APIKey, APISecret, Text):
self.APPID = APPID
self.APIKey = APIKey
self.APISecret = APISecret
self.Text = Text
# 公共参数(common)
self.CommonArgs = {"app_id": self.APPID}
# 业务参数(business),更多个性化参数可在官网查看
self.BusinessArgs = {"aue": "raw", "auf": "audio/L16;rate=16000", "vcn": "xiaoxue", "tte": "utf8", "ent": "aisound"}
self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-8')), "UTF8")}
# 使用小语种须使用以下方式,此处的unicode指的是 utf16小端的编码方式,即"UTF-16LE"”
# self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-16')), "UTF8")}
#
self.url = self.create_url()
# 生成url
def create_url(self):
url = 'wss://tts-api.xfyun.cn/v2/tts'
# 生成RFC1123格式的时间戳
now = datetime.now()
date = format_date_time(mktime(now.timetuple()))
# 拼接字符串
signature_origin = "host: " + "ws-api.xfyun.cn" + "\n"
signature_origin += "date: " + date + "\n"
signature_origin += "GET " + "/v2/tts " + "HTTP/1.1"
# 进行hmac-sha256进行加密
signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
digestmod=hashlib.sha256).digest()
signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (
self.APIKey, "hmac-sha256", "host date request-line", signature_sha)
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
# 将请求的鉴权参数组合为字典
v = {
"authorization": authorization,
"date": date,
"host": "ws-api.xfyun.cn"
}
# 拼接鉴权参数,生成url
url = url + '?' + urlencode(v)
print("date: ", date)
print("v: ", v)
# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
print('websocket url :', url)
return url
def on_message(ws, message):
try:
message = json.loads(message)
code = message["code"]
sid = message["sid"]
audio = message["data"]["audio"]
audio = base64.b64decode(audio)
status = message["data"]["status"]
# print(message)
if status == 2:
print("ws is closed")
ws.close()
if code != 0:
errMsg = message["message"]
print("sid:%s call error:%s code is:%s" % (sid, errMsg, code))
else:
with open('./demo333.pcm', 'ab') as f:#用追加的模式写入语音
f.write(audio)
except Exception as e:
print("receive msg,but parse exception:", e)
# 收到websocket错误的处理
def on_error(ws, error):
print("### error:", error)
# 收到websocket关闭的处理
def on_close(ws):
print("### closed ###")
# 收到websocket连接建立的处理
def on_open(ws):
def run(*args):
# TODO while true
d = {"common": wsParam.CommonArgs,
"business": wsParam.BusinessArgs,
"data": wsParam.Data,
}
d = json.dumps(d)
print(d)
print("------>开始发送文本数据")
ws.send(d)
if os.path.exists('./demo.pcm'):
os.remove('./demo.pcm')
thread.start_new_thread(run, ())
if __name__ == "__main__":
# 测试时候在此处正确填写相关信息即可运行
text = '苹果中国宣布iPad降价:最高降幅达500元'
from config import APIKey, APISecret, APPID
wsParam = Ws_Param(APPID=APPID,
APIKey=APIKey,
APISecret=APISecret,
Text=text) # "这是一个语音合成示例"
websocket.enableTrace(True)
wsUrl = wsParam.create_url()
print('wsUrl:', wsUrl)
ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
ws.on_open = on_open
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
================================================
FILE: 2020/1-19-TTS语音合成/讯飞语音/xf_service.py
================================================
# -*- coding: utf-8 -*-
# @Time : 2020-01-18 20:25
# @File : xf_service.py
"""
xf_service.py:
"""
# import websocket
from websocket import create_connection
import datetime
import hashlib
import base64
import hmac
import json
from urllib.parse import urlencode
import os
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime
class XFtts(object):
# 初始化
def __init__(self, APPID, APIKey, APISecret, ):
self.APPID = APPID
self.APIKey = APIKey
self.APISecret = APISecret
# self.Text = Text
# 公共参数(common)
self.CommonArgs = {"app_id": self.APPID}
# 业务参数(business),更多个性化参数可在官网查看
self.BusinessArgs = {"aue": "raw", "auf": "audio/L16;rate=16000", "vcn": "xiaoxue", "tte": "utf8", "ent": "aisound"}#TODO
# self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-8')), "UTF8")}
# 使用小语种须使用以下方式,此处的unicode指的是 utf16小端的编码方式,即"UTF-16LE"”
# self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-16')), "UTF8")}
#
self.url = self.create_url()
# 生成url
def create_url(self):
url = 'wss://tts-api.xfyun.cn/v2/tts'
# 生成RFC1123格式的时间戳
now = datetime.now()
date = format_date_time(mktime(now.timetuple()))
# 拼接字符串
signature_origin = "host: " + "ws-api.xfyun.cn" + "\n"
signature_origin += "date: " + date + "\n"
signature_origin += "GET " + "/v2/tts " + "HTTP/1.1"
# 进行hmac-sha256进行加密
signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
digestmod=hashlib.sha256).digest()
signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (
self.APIKey, "hmac-sha256", "host date request-line", signature_sha)
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
# 将请求的鉴权参数组合为字典
# authorization='YXBpX2tleT0iODc1YmQ5OGNmOTJmZTE0OGQxNDU5ODFiZjZmNGJhMGEiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0ia3RlelJoV2lMS2tvbW9rbXcxZDhvZ1Q5WE5Obld1ZWhqcjFWUVhleFZkTT0i'
v = {
"authorization": authorization,
"date": date,
"host": "ws-api.xfyun.cn"
}
# 拼接鉴权参数,生成url
url = url + '?' + urlencode(v)
# print("date: ", date)
# print("v: ", v)
# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
# print('websocket url :', url)
# url='wss://tts-api.xfyun.cn/v2/tts?authorization=YXBpX2tleT0iODc1YmQ5OGNmOTJmZTE0OGQxNDU5ODFiZjZmNGJhMGEiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iU0hnZ1lLa2c4Y0xUV25BdTNTNGkwak90YzhYNnM1WENrTFFIUHRLekc0VT0i&date=Sat,%2004%20Jan%202020%2004:19:03%20GMT&host=ws-api.xfyun.cn'
return url
def say(self, sentens,speaker='xiaoxue'):#发音人
print(sentens)
text = str(base64.b64encode(sentens.encode('utf-8')), "UTF8")
# print(text)
self.BusinessArgs['vcn']=speaker
Data = {"status": 2, "text": text}
d = {"common": self.CommonArgs,
"business": self.BusinessArgs,
"data": Data,
}#传参
dt = json.dumps(d)
print(d)
# if not ws.connected:
# print('重新连接ws')
# # uri = wsParam.create_url()
# ws = create_connection(uri)
ws = create_connection(self.create_url())
ws.send(dt)
print('-' * 30)
print('接收信息')
audiosum = bytes()
while True:
message = ws.recv()
# print(message)
try:
message = json.loads(message)
code = message["code"]
sid = message["sid"]
audio = message["data"]["audio"]
audio = base64.b64decode(audio)
status = message["data"]["status"]
if status == 2:
audiosum += audio
print("ws is closed")
ws.close()
# wav_path = f'./wav-{index}.wav'
# wav_path = f'{dir}/{index}.wav'
# with wave.open(wav_path, 'wb') as wavfile:
# wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
# wavfile.writeframes(audiosum) # TODO byteIO ?
# print('写入 ', wav_path)
# rsd[index] = {'sentens': sentens, 'file': wav_path}
return audiosum
# break
if code != 0:
errMsg = message["message"]
print("sid:%s call error:%s code is:%s" % (sid, errMsg, code))
else:
audiosum += audio
continue
except Exception as e:
print("receive msg,but parse exception:", e)
pass
def tts_say_wave(wav_path,text):
import wave
from config import APIKey, APISecret, APPID
wsParam = XFtts(APPID=APPID,
APIKey=APIKey,
APISecret=APISecret, )
audiosum = wsParam.say(text)
# audiosum += audio
with wave.open(wav_path, 'wb') as wavfile:
wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
wavfile.writeframes(audiosum)
print('写入 ', wav_path)
pass
def main():
wav_path = f'test1.wav'
text = '而除了靠免费盗版片获取流量,以广告等方式变现的途径外,更直接的盈利方式就是直接售卖盗版资源。2019年4月,媒体报道称河南公安机关已打击2个制作销售高清盗版电影的犯罪团伙,截止案发,这2个团伙共制作盗版影片320余部,初步估算非法获利700余万元。'
tts_say_wave(wav_path,text)
pass
if __name__ == '__main__':
main()
================================================
FILE: 2020/1-20-hacker-tools/README.md
================================================
## Docker黑客工具
- 视频:[一行命令让你成为黑客高手!!!Docker黑客工具](https://www.bilibili.com/video/av84227396/)
- https://hub.docker.com/r/veerendrav2/hacker-tools
- 下载
- docker pull veerendrav2/hacker-tools
- 启动
- docker run -it --rm --net=host --privileged veerendrav2/hacker-tools
- 启动squid代理
- docker run -it --rm -p 3128:3128 datadog/squid
- docker exec -it 1bff576f3afc /bin/bash
- 测试
- traceroute baidu.com
- ping 172.17.0.2
- nmap 172.17.0.2
================================================
FILE: 2020/1-3-特朗普-推特-截图/README.md
================================================
# 特朗普-推特-截图
- 首先要使用代理
- args: ['--proxy-server=127.0.0.1:8118'],
- 然后page.goto(main_url)
- 使用selector获取【推文】元素
- 截图
================================================
FILE: 2020/1-3-特朗普-推特-截图/twitter_screenshot1.js
================================================
/*
要使用代理执行
*/
const puppeteer = require('puppeteer');
var main_url='https://twitter.com/realDonaldTrump'
async function run() {
//const browser = await puppeteer.launch();
browser = await puppeteer.launch({
headless: false,
timeout: 20000,
DefaultArgs:'--mute-audio',
ignoreDefaultArgs: ['--enable-automation'],
executablePath: '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome',//可注销
//也可以改为你系统里Chrome的目录
ignoreHTTPSErrors: true,
args: ['--proxy-server=127.0.0.1:8118'],
});
const page = await browser.newPage();
await page.setViewport({width: 1280, height: 1000})
await page.goto(main_url)
console.log('page.waitFor(10000)')
await page.waitFor(4000)
// const element = await page.$("body");
// await element.screenshot({
// path: "screenshot.png"
// });
// let elements=document.querySelectorAll('div > article')
console.log('kaishi截图')
let elements=await page.$$('#stream-items-id > li')
console.log('截图',elements.length)
for (var i = 0; i < elements.length; i++) {
console.log(i);
await elements[i].screenshot({
path: i+"_screenshot.png"
});
await page.waitFor(1000)
}
// elements.forEach(async function(element,index){
// console.log(index)
// await element.screenshot({
// path: index+"_screenshot.png"
// });
// })
console.log('page.waitFor(2000);')
await page.waitFor(200000);
// setTimeout()
browser.close();
}
run();
================================================
FILE: 2020/10-9-weShare-ink-display/README.md
================================================
## 微雪-墨水屏-编程
## 视频
- [微雪墨水屏-Arduino编程,ESP32 支持WiFi和蓝牙](https://www.bilibili.com/video/BV1yz4y1C7Y8/)
## 购买
- 淘宝,运费6元
- [微雪 墨水屏裸屏驱动板 SPI接口 ESP32 ESP8266 支持WIFI/蓝牙](https://s.click.taobao.com/t?e=m%3D2%26s%3DLWwjUCPQv2QcQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67trmiN9ZoeYrZW7hPg9HazilldgrEKAMDZqHHjUPN5fPvcXgLQcnSPhUUJCbLNYEnHJi6DFpZGNc%2Bht3wBcxEojg%2BvVPtZxVh1vzY1gj2%2FS51m%2FRykadurUYtE6uZJaO3HEqY%2Bakgpmw&scm=null&pvid=null&app_pvid=59590_11.88.32.203_568_1602231743720&ptl=floorId%3A17741&originalFloorId%3A17741&app_pvid%3A59590_11.88.32.203_568_1602231743720&union_lens=lensId%3APUB%401602231720%400b1a25df_d9d4_1750c73d849_2645%40026UvXKptoe9OnJOZeqXA9tB)
- e-Paper ESP32 Driver Board
- [微雪 4.2寸墨水屏裸屏 电子纸 显示模块 红黑白三色 兼容树莓派4](https://s.click.taobao.com/t?e=m%3D2%26s%3Dgu%2FRd0bRTGkcQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67ogRc0DrYpkvFfrEfJ4hp2qlldgrEKAMDZqHHjUPN5fPvcXgLQcnSPhUUJCbLNYEnHJi6DFpZGNc%2Bht3wBcxEojg%2BvVPtZxVh1vzY1gj2%2FS51m%2FRykadurUDBRIF6NDIT3EqY%2Bakgpmw&scm=null&pvid=null&app_pvid=59590_11.26.37.22_555_1602231877211&ptl=floorId%3A17741&originalFloorId%3A17741&app_pvid%3A59590_11.26.37.22_555_1602231877211&union_lens=lensId%3APUB%401602231873%400b14eca8_ae89_1750c763150_4d4c%40027HYB50teMJ7vU6A8SsikWj)
- 资料
- https://www.waveshare.net/wiki/E-Paper_ESP32_Driver_Board
- 根据这个指南,安装软件和驱动
- 下载案例 E-Paper_ESP32_Driver_Board_Code
- 外国参考 https://www.hackster.io/vitorio/e-paper-name-tag-2d22cc
- 步骤
- Windows 7 安装 Arduino IDE
- 在GitHub下载 [Arduino-ESP32 支持包](https://codeload.github.com/espressif/arduino-esp32/zip/master) 驱动,放在hardware文件夹,新建子文件夹
- 使用管理员权限打开cmd
```
cd C:\Program Files (x86)\Arduino\hardware\espressif\esp32\tools
C:\Program Files (x86)\Arduino\hardware\espressif\esp32\tools>get.exe
System: Windows, Info: Windows-7-6.1.7601-SP1
Platform: i686-mingw32
Downloading xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip
Done
Extracting xtensa-esp32-elf-win32-1.22.0-80-g6c4433a-5.2.0.zip
Downloading esptool-2.6.1-windows.zip
Done
Extracting esptool-2.6.1-windows.zip
Downloading mkspiffs-0.2.3-arduino-esp32-win32.zip
Done
Extracting mkspiffs-0.2.3-arduino-esp32-win32.zip
Renaming mkspiffs-0.2.3-arduino-esp32-win32/ to mkspiffs
Done
```
## WiFi案例
- 然后打开ArduinoIDE
- 打开WiFi案例,编译,上传
- 编译完后,马上长按boot键
- 等上传完毕,松开
- 打开串口后台,波特率:115200
- 按下EN键,连接WiFi
- 串口显示IP
- 浏览器登录http://192.168.1.104/
- 上传图片
- 尺寸 4.2b ? c ?
- 串口输出
```
ets Jun 8 2016 00:22:57
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10864
load:0x40080400,len:6432
entry 0x400806b8
Connecting to Pro
.
WiFi connected
Server started
192.168.1.104
Ok!
```
## 蓝牙案例
- 跟WiFi案例相同,编译上传固件
- 在案例文件夹里找到app-release.apk,上传到手机安装
- 手机蓝牙,连接电子纸驱动板
- 打开App,上传图片
## macOS系统
- 安装驱动很麻烦,不支持,不推荐使用macOS
```
I found that macOS High Sierra has blocked the SiLabs kernel extension.
Here are steps to allow this extension:
Go to "System Preferences" -> "Security & Privacy"
In the bottom of the window, you will see a message "System software from developer "SiLabs" was blocked from loading."
Click on "Allow" button
Restart your Mac
Now my device is listed as /dev/cu.SLAB_USBtoUART and everything work as expected.
```
## 售后
- 微雪客服,技术支持工程师
```
EMAIL:2355742828@qq.com
电话:0755-83040712
QQ: 2355742828
```
================================================
FILE: 2020/11-25-use-Search-engine/README.md
================================================
# 怎样使用搜索引擎
- 视频 [【实践】怎样使用搜索引擎?代替Google](https://www.bilibili.com/video/BV1UD4y1X7xm/)
## 国内
- 不要使用百度
- 使用微软bing
- https://cn.bing.com/
- 能搜到大部分信息
- 其他搜索引擎
- 平时我都不用
- 只能搜索到部分信息
- 搜狗
- 用来搜微信公众号
- 360
- 绑定在360浏览器,设置其他搜索引擎非常麻烦,让你放弃,老老实实使用360搜索
## 国外
- Google
- https://www.google.com/ 不能访问
- http://www.google.cn/
- 会调整到http://www.google.com.hk/webhp?hl=zh-CN&sourceid=cnhp
- 打不开
- 用来下载 Chome 和 Google Earth
- http://www.google.cn/chrome/
- http://www.google.cn/intl/zh-CN/earth/
- 翻译 https://translate.google.cn/?hl=zh-CN
- https://www.google.com.hk
- 打不开
- https://duckduckgo.com/
- 打不开
## 代替 Google
- 雅虎搜索
- AOL搜索
- https://search.aol.com/
- 俄罗斯
- https://yandex.com/
- 捷克
- https://search.centrum.cz/
- 推荐使用这个,因为它使用Google的结果
- 有验证码
## 搭建网站
- https://github.com/makelove/whoogle-search
- 没有广告
- 没有跟踪/链接您的个人IP地址
- 易于安装/部署
- [Heroku快速部署](https://heroku.com/about)
================================================
FILE: 2020/12-17-Azure-server-free/README.md
================================================
## 免费Azure服务器
- 视频 [【亲测有效】申请微软Azure服务器免费12个月](https://www.bilibili.com/video/BV12p4y1q7t7/)
- 参考
- [申请微软Azure服务免费12个月+$200 额度+永久免费(25+项服务)](https://www.daniao.org/7057.html)
- 首月送200美金,10T流量随意用
- vps免费资源为1G内存/40G空间/15G月流量,持续一年。
- 套路
- 需要试用完200美元或者过了30天后,必须升级即用即付后,才能享受12个月免费服务
- 免费12个月期间,如果产生扣费(比如流量超了)会在下个月账单中直接信用卡扣费。
- 免费12个月到期后,订阅不会停止,已开通的免费资源会直接产生扣费
- 注册
- 活动 [通过 12 个月的免费服务开始使用](https://azure.microsoft.com/zh-cn/free/)
- 一张信用卡,验证卡的时候扣费1美刀!(VISA或者万事达,且没有激活过其他账号)
- 创建虚拟机vps
- 选择配置的时候一定要选择标准 B1s这个配置
- 只有它才免费
- 创建用户时,建议使用 【ssh密钥】,到时登录不需要密码,很方便
- 创建完成后
- 【网络】添加【入站端口】
- 登录服务器
- ssh 【你的账号】@【你的IP】
- ssh ms@168.62.xxx.xxx
- 翻墙
- Nginx反向代理
- Squid代理
- 用来做爬虫
- 参考
- 搭建 https://www.linuxidc.com/Linux/2019-08/159960.htm
- squid搭建高匿名代理服务 https://www.jianshu.com/p/96c8f1f7fd17
- 测试
- curl -x 你的IP:3128 http://httpbin.org/ip
- SSR
- 比较复杂
- 微软发公告禁止翻墙
- ssh 隧道
- 最简单
- 先登录服务器 ssh -f -NC -D 2345 ms@168.62.xxx.xxx
- sock5代理,端口是2345
- 然后在Chrome浏览器的【Proxy SwitchyOmega】插件设置代理
- 代理协议是SOCKS5,IP是127.0.0.1,端口是2345
- 测试
- curl --socks5 localhost:2345 http://httpbin.org/ip
- Python 虚拟环境
- sudo apt-get install python3-pip
- pip3 install virtualenv
- virtualenv -p /usr/bin/python3.6 .py3
- 把source ~/.py3/bin/activate
- 加到~/.bashrc末尾
- 这样,每次登录服务器,就能自动使用Python 虚拟环境
- YouTube视频
- pip3 install youtube_dl
- sudo apt install ffmpeg
- pip3 install python-ffmpeg-video-streaming
- 下载视频
- 从服务器到本机
- 使用Nginx
- sudo ln -s /home/ms/video/ /var/www/html/video
- 修改Nginx配置,添加【目录遍历】
- 参考 https://blog.csdn.net/ddazz0621/article/details/85338671
- 打开 http://服务器IP/video/
- 可以使用ftp,比较慢
- 使用Flask ,比较快,1 m/s
- response=send_file(fp,as_attachment=True,attachment_filename=filename)
- 使用m3u8在线观看,hls流式播放
- https://github.com/newnewcoder/flask-hls-demo
- https://github.com/aminyazdanpanah/python-ffmpeg-video-streaming
- 问题,ts文件大,网速慢,体验差
```
(.py3) ms@f1:~/video$ youtube-dl https://www.youtube.com/watch?v=79aP7BhrbuI
[youtube] 79aP7BhrbuI: Downloading webpage
[youtube] 79aP7BhrbuI: Downloading MPD manifest
[download] Destination: The world's top 10 ultimate travel experiences-79aP7BhrbuI.mp4
[download] 100% of 29.18MiB in 00:01
```
- Google Earth Studio
- 翻墙后,配置Chrome浏览器的【Proxy SwitchyOmega】插件
- 打开 https://earth.google.com/studio/
- 需要申请,很快通过,当天
- 新建工程,然后调整视角,地点
- 渲染,它会自动导出高分辨率的图片到你的电脑
- 然后使用【视频剪辑软件】合并成视频
- 使用FFmpeg命令行
- 参考 https://blog.csdn.net/wangshuainan/article/details/77914508
- ffmpeg -i 测试1_%03d.jpeg -vcodec libx264 -r 30 test.mp4
- 【测试1】 为工程名称
- 图片:测试1_441.jpeg
- -r 30 帧率
- -vcodec libx264 编码器
- 视频[【测试】Google Earth Studio 样片,使用ffmpeg合成,无声](https://www.bilibili.com/video/BV1yp4y1q7Nw/)
- 使用moviepy
================================================
FILE: 2020/12-19-password-generator/README.md
================================================
## Python密码生成器
- 视频 [Python密码生成器,轻松实现](https://www.bilibili.com/video/BV1sf4y1e7gk/)
- 参考
- https://github.com/redacted/XKCD-password-generator
- https://pypi.org/project/random-password-generator/
- https://github.com/PyLamGR/PyVault
- 代码
- [password.py](password.py)
- 需求
- 1.很多网站App,新建账号时需要添加密码
- 2.简单密码不安全
- 3.在多个网站使用同一个密码,也不安全
- 4.创建密码后,使用Excel或密码管理器1password保存
- 5.Chrome浏览器自带密码管理
================================================
FILE: 2020/12-19-password-generator/password.py
================================================
# -*- coding: utf-8 -*-
# @Time : 2020/12/19 13:29
# @File : password.py
"""
password.py:
password-generator
快捷方式
alias pw='python3 /Users/play/CODE/Python_Test/密码生成器/password.py'
"""
import sys
import random, string
def 不重复(size=6, chars=string.ascii_letters + string.digits):
pw = ''
for _ in range(size):
x = random.choice(chars)
pw += x
chars = chars.replace(x, '')
pass
return pw
def random_string_generator(size=6, chars=string.ascii_letters + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def main(size):
# return random_string_generator(size)
return 不重复(size)
pass
if __name__ == '__main__':
if len(sys.argv) > 1:
num = int(sys.argv[1])
else:
num = 8
if num > 62:
print('长度太大')
else:
rs = main(num)
print(rs)
================================================
FILE: 2020/12-21-python-hosts/README.md
================================================
## 用来翻墙
- 视频 [Python 工具库python-hosts的使用](https://www.bilibili.com/video/BV1y5411G7Kj/)
- 代码
- [add-host-ip.py](add-host-ip.py)
- 怎样修改域名+IP,打开国外网站更流畅?
- 查询 全球DNS
- https://www.gdnspc.com/
- 国内 https://www.ping.cn/dns
- [拨号API接口](https://www.ping.cn/api)
- 获取 服务器IP
- 把curl转成Python Requests代码
- https://curl.trillworks.com/
- 检查本地能否连接该IP
- [python requests toolbelt 工具带的使用](https://www.bilibili.com/video/BV1rh411Z73N/)
- 写入/etc/hosts
- 参考
- https://github.com/jonhadfield/python-hosts
- 解析/etc/hosts
- 可以添加或删除【 IP+domain】映射
================================================
FILE: 2020/12-21-python-hosts/add-host-ip.py
================================================
# -*- coding: utf-8 -*-
# @Time : 2020/12/21 11:56
# @File : add-host-ip.py
"""
add-host-ip.py:
自动添加/etc/hosts 域名绑定IP
"""
import requests
def 查询全球DNS(host):
import requests
headers = {
'authority': 'www.gdnspc.com',
'sec-ch-ua': '"Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"',
'accept': 'application/json, text/javascript, */*; q=0.01',
'dnt': '1',
'x-requested-with': 'XMLHttpRequest',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://www.gdnspc.com/',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'cookie': '__cfduid=d7f182d3c5a68e71c2a9902c472e8a3631608433922; _ga=GA1.2.1900327867.1608433937; _gid=GA1.2.337357370.1608433937; __gads=ID=6af39aca34d98035-22caac9a43c50018:T=1608433936:RT=1608433936:S=ALNI_MaE5H6FI7G_xbl_V_rJex291IiUkw; PHPSESSID=468b4c4c7f252da4308788b995996134',
}
params = (
('s', '162'),
('t', 'A'),
('q', 'raw.githubusercontent.com'),
('k', 'AyaEUoRPnk5yximSDQFBow2FGoM91qP1'),
('r', '1608534545-CFbFIYp4MCn78Beb'),
)
response = requests.get('https://www.gdnspc.com/api/checker', headers=headers, params=params)
js = response.json()
return js['result'][0]['record']
pass
def 查询全球DNS2(host):
headers = {
'authority': 'www.whatsmydns.net',
'sec-ch-ua': '"Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"',
'accept': 'application/json, text/plain, */*',
'dnt': '1',
'sec-ch-ua-mobile': '?0',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'sec-fetch-site': 'same-origin',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'referer': 'https://www.whatsmydns.net/',
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'cookie': '__cfduid=dd845ca2c0dae8ef04fade64da42aa53d1608433918; _ga=GA1.2.864067538.1608433921; _gid=GA1.2.1694506165.1608433921; __gads=ID=7c02c0ed2adccebb:T=1608527151:S=ALNI_MYn8MpuX26lqec-GtWHF_fWoSR1qA; _gat=1',
}
params = (
('server', '343'),
('type', 'A'),
('query', host,), # 'hide.me'
)
response = requests.get('https://www.whatsmydns.net/api/details', headers=headers, params=params)
js = response.json()
return js['data'][0]['response'][0] #js['result'][0]['record']
pass
import socket
def 检查本地能否连接该IP(ip, host): # OK
from requests.exceptions import ConnectTimeout,ConnectionError
from requests_toolbelt.adapters import host_header_ssl
s = requests.Session()
s.mount('https://', host_header_ssl.HostHeaderSSLAdapter())
headers = {
"Host": host,
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
}
# rs = s.get("https://"+ip, headers={"Host": host})
try:
rs = s.get(f"https://{ip}/", headers=headers, timeout=4, verify=False,allow_redirects=False)
print(rs.status_code, rs.headers)
except ConnectTimeout as e:
return False
except Exception as e:
print(e)
return True
pass
def 检查本地能否连接该IP1(ip):
# import socket
# s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# try:
# s.connect((ip, 80))
# print("Port 80 reachable")
# except socket.error as e:
# print("Error on connect: %s" % e)
# s.close()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.connect((ip, 80))
print("Port 80 reachable")
return True
except socket.error as e:
print("Error on connect: %s" % e)
return False
def 检查本地能否连接该IP2(ip):
try:
socket.gethostbyaddr(ip)
except socket.herror:
print(u"Unknown host 连接不上")
return False
return True
pass
def main(url):
# 查询 全球DNS
# 获取 服务器IP
from urllib.parse import urlparse
host = urlparse(url).netloc
print('host:',host)
ip = 查询全球DNS(host)
# 检查本地能否连接该IP
print('检查本地能否连接该IP')
print('-'*40)
tf = 检查本地能否连接该IP(ip, host)
print('-'*40)
# ip='151.101.124.133'
# tf=True
# 写入/etc/hosts
if tf:
print('写入/etc/hosts')
# Root 用户
from python_hosts import Hosts, HostsEntry
hosts = Hosts(path='/etc/hosts')
new_entry = HostsEntry(entry_type='ipv4', address=ip, names=[host])
hosts.add([new_entry])
hosts.write()
pass
else:
print('该IP不能连接', ip)
pass
if __name__ == '__main__':
import sys
if len(sys.argv) > 1:
url = sys.argv[1]
main(url)
else:
print('添加url')
# 检查本地能否连接该IP('8.7.198.46', 'google.com')
# 检查本地能否连接该IP('174.138.52.82', 'hide.me')
# 检查本地能否连接该IP('151.101.52.133', 'raw.githubusercontent.com')
================================================
FILE: 2020/12-21-requests-toolbelt/README.md
================================================
## python requests toolbelt 工具带的使用
- 视频 [python requests toolbelt 工具带的使用](https://www.bilibili.com/video/BV1rh411Z73N/)
- 步骤
- 1.Request请求绑定 网卡IP
- 2.Request请求绑定 目标服务器IP
- 参考
- https://stackoverflow.com/questions/28773033/python-requests-how-to-bind-to-different-source-ip-for-each-request
- https://github.com/psf/requests/issues/394
- 官方文档
- https://toolbelt.readthedocs.io/en/latest/user.html
================================================
FILE: 2020/12-22-PyGithub/README.md
================================================
## Github API 的使用-PyGithub
- 视频 [Github API 的使用-PyGithub](https://www.bilibili.com/video/BV1fh411Z777/)
- 参考
- 第一个例子 [How to Use Github API in Python](https://www.thepythoncode.com/article/using-github-api-in-python)
- [PyGithub](https://github.com/PyGithub/PyGithub)
- [文档](https://pygithub.readthedocs.io/en/latest/introduction.html)
- [Examples例子代码](https://pygithub.readthedocs.io/en/latest/examples.html)
- [使用 Python3 编写 Github 自动周报生成器](https://www.jianshu.com/p/a0af604b3d97)
- 不错 [使用GitHub API和Python可以做的所有事情](https://towardsdatascience.com/all-the-things-you-can-do-with-github-api-and-python-f01790fca131) 要翻墙
- [Rate limit
](https://docs.github.com/en/free-pro-team@latest/rest/reference/rate-limit)
- [创建个人token](https://github.com/settings/tokens)
================================================
FILE: 2020/12-4-chrome-enable-network-request-blocking/README.md
================================================
## 创建Chrome扩展程序以阻止网站请求
- 视频 [【经验】开发Chrome插件,浏览器禁止某些网络请求,更快加载国外的网站](https://www.bilibili.com/video/BV1TT4y1M72r/)
- 代码
- [Chrome Request Blocker Extension](https://github.com/clupasq/ChromeHttpRequestBlocker)
- 参考
- Chrome Dev tool
- > opening the 3-dot-menu at the top right of the dev tools
- >> More tools
- >>> Request blocking
- https://stackoverflow.com/questions/18158297/blocking-request-in-chrome
- [BlockIt - Chrome extension to block requests](https://www.codeproject.com/Articles/1179350/BlockIt-Chrome-extension-to-block-requests)
- [创建一个简单的扩展程序以阻止网站](https://ops.tips/blog/extension-to-block-websites/)
================================================
FILE: 2020/12-5-flask-ffmpeg-m3u8/README.md
================================================
## Python编程,Flask网站播放m3u8流媒体
- 视频 [【Python编程】Flask网站播放m3u8流媒体](https://www.bilibili.com/video/BV15K4y1L7nF/)
- 步骤
- FFmpeg切割视频,ts
- m3u8指向ts段文件
- 在浏览器端使用hls.js播放视频
- 代码
- https://github.com/newnewcoder/flask-hls-demo
- https://github.com/aminyazdanpanah/python-ffmpeg-video-streaming
- 文档 https://video.aminyazdanpanah.com/python/start
- m3u8文件解析 https://github.com/globocom/m3u8
- 加密m3u8
- Encryption(DRM)
- 参考
- [使用FFmpeg作为HLS流服务器(第1部分)– HLS基础](https://www.martin-riedl.de/2018/08/24/using-ffmpeg-as-a-hls-streaming-server-part-1/)
- 第二部分 https://www.martin-riedl.de/2018/08/24/using-ffmpeg-as-a-hls-streaming-server-part-2/
- [m3u8下载](https://gist.github.com/primaryobjects/7423d7982656a31e72542f60d30f9d30)
- ffmpeg 切割视频,生成m3u8
```shell script
ffmpeg -i input.mp4 \
-c:v libx264 -crf 21 -preset veryfast \
-c:a aac -b:a 128k -ac 2 \
-f hls -hls_time 4 -hls_playlist_type event stream.m3u8
ffmpeg -i input.mp4 \
-c:v libx264 -c:a aac -strict -2 -hls_time 20 -f hls output.m3u8
```
================================================
FILE: 2020/2-1-WordCloud-武汉/README.md
================================================
- 视频:[怎样用Python制作【词云】?武汉-冠状病毒](https://www.bilibili.com/video/av86091936/)
从【微博搜索】获取【热门微博】
然后用【结巴分词】提取关键词
使用Wordcloud制作词云
关键点是中文字体路径
否则显示不出来
================================================
FILE: 2020/2-1-WordCloud-武汉/词云-Alice-英文.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 参考 https://github.com/amueller/word_cloud/blob/master/examples/simple.py"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from wordcloud import WordCloud"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"text = open('/Users/play/Downloads/alice.txt').read()\n",
"#https://github.com/amueller/word_cloud/blob/master/examples/alice.txt"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"145190"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(text)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"wordcloud = WordCloud( width=1000, height=860).generate(text)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(-0.5, 999.5, 859.5, -0.5)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(wordcloud, interpolation='bilinear')\n",
"plt.axis(\"off\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
gitextract_yt17wx8s/ ├── .gitignore ├── 2019/ │ ├── 12-16-Github-Pull-requests-gocolly/ │ │ └── Github-Pull-requests-gocolly.md │ ├── 12-18-Caddy搭建Google镜像-反向代理/ │ │ └── Caddy搭建Google镜像-反向代理.md │ ├── 12-26-用docker模拟Nginx限制同一个爬虫ip的访问频率/ │ │ └── 用docker模拟Nginx限制同一个爬虫ip的访问频率.md │ ├── 12-29-Docker-OpenCV-golang-gocv/ │ │ ├── README.md │ │ └── facedetect-from-url/ │ │ ├── facedetect │ │ └── main.go │ ├── 12-30-Docker-Puppeteer抓取动态页面/ │ │ ├── README.md │ │ └── puppeteer/ │ │ └── docker-puppeteer-pdf.js │ └── 12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/ │ ├── README.md │ └── docker-h5.js ├── 2020/ │ ├── 1-19-TTS语音合成/ │ │ ├── README.md │ │ └── 讯飞语音/ │ │ ├── config.py │ │ ├── tts_ws_python3_demo.py │ │ └── xf_service.py │ ├── 1-20-hacker-tools/ │ │ └── README.md │ ├── 1-3-特朗普-推特-截图/ │ │ ├── README.md │ │ └── twitter_screenshot1.js │ ├── 10-9-weShare-ink-display/ │ │ └── README.md │ ├── 11-25-use-Search-engine/ │ │ └── README.md │ ├── 12-17-Azure-server-free/ │ │ └── README.md │ ├── 12-19-password-generator/ │ │ ├── README.md │ │ └── password.py │ ├── 12-21-python-hosts/ │ │ ├── README.md │ │ └── add-host-ip.py │ ├── 12-21-requests-toolbelt/ │ │ └── README.md │ ├── 12-22-PyGithub/ │ │ └── README.md │ ├── 12-4-chrome-enable-network-request-blocking/ │ │ └── README.md │ ├── 12-5-flask-ffmpeg-m3u8/ │ │ └── README.md │ ├── 2-1-WordCloud-武汉/ │ │ ├── README.md │ │ ├── 词云-Alice-英文.ipynb │ │ └── 词云wordcloud-中文.ipynb │ ├── 2-12-Elasticsearch-Chrome/ │ │ ├── README.md │ │ └── 分词.md │ ├── 2-13-微博实时抓取/ │ │ └── README.md │ ├── 2-17-Python-secrets/ │ │ └── README.md │ ├── 2-18-Docker-Go-goProxy/ │ │ └── README.md │ ├── 2-18-Scrapy-auto-proxy/ │ │ ├── README.md │ │ └── manage_proxy.py │ ├── 2-19-JetBrains-Pycharm-破解/ │ │ ├── README.md │ │ └── demo/ │ │ ├── .vscode/ │ │ │ └── launch.json │ │ ├── demo.py │ │ ├── go.mod │ │ └── t1.go │ ├── 2-20-Python-Siri-语音朗读文章/ │ │ ├── Global-hotkeys.py │ │ ├── README.md │ │ ├── copy-string-tts.py │ │ ├── copy-string-tts2.py │ │ └── keyboard_Listener1.py │ ├── 2-22-Scrapy-Puppeteer-Js/ │ │ ├── README.md │ │ ├── demo/ │ │ │ ├── demo/ │ │ │ │ ├── __init__.py │ │ │ │ ├── items.py │ │ │ │ ├── middlewares.py │ │ │ │ ├── pipelines.py │ │ │ │ ├── settings.py │ │ │ │ └── spiders/ │ │ │ │ ├── __init__.py │ │ │ │ └── example.py │ │ │ ├── main.py │ │ │ └── scrapy.cfg │ │ ├── docker-puppeteer-index.js │ │ ├── index.html │ │ ├── js_server.go │ │ ├── js_server.py │ │ └── templates/ │ │ └── index.html │ ├── 2-23-压力测试-locust/ │ │ ├── README.md │ │ ├── locust-get.py │ │ ├── locust_file.py │ │ └── server.go │ ├── 2-24-Go-Module/ │ │ ├── README.md │ │ └── demo/ │ │ ├── a │ │ ├── a.go │ │ ├── a2.go │ │ ├── dir1/ │ │ │ ├── b.go │ │ │ ├── b2.go │ │ │ └── dir11/ │ │ │ └── b11.go │ │ ├── dir2d/ │ │ │ ├── d2.go │ │ │ └── d21.go │ │ └── go.mod │ ├── 2-26-Go_Proxy_server/ │ │ ├── README.md │ │ ├── go.mod │ │ ├── proxy_server │ │ └── proxy_server.go │ ├── 2-26-多点签到领积分/ │ │ ├── README.md │ │ ├── demo1.py │ │ ├── 多点-签到-抓包.txt │ │ └── 多点-领取奖励-抓包.txt │ ├── 2-29-Docker-WeChat/ │ │ └── README.md │ ├── 2-3-Chrome-extensions/ │ │ ├── README.md │ │ ├── content_scripts和background的消息传递.md │ │ └── 参考.md │ ├── 2-4-App-Store/ │ │ ├── 怎样做一个像 【七麦数据】那样的网站.txt │ │ └── 苹果 接口 node-js.txt │ ├── 2-5-Go语言入门/ │ │ └── README.md │ ├── 2-5-TTS-Moviepy/ │ │ ├── README.md │ │ └── TTS/ │ │ ├── Install.txt │ │ ├── config.py │ │ ├── xf_service.py │ │ └── 语音合成自动视频.ipynb │ ├── 2-6-BT_Torrent/ │ │ └── README.md │ ├── 2-6-Spider-Speed-test/ │ │ ├── README.md │ │ ├── go_spider │ │ ├── go_spider.go │ │ ├── scrapy_demo/ │ │ │ ├── README.md │ │ │ ├── scrapy.cfg │ │ │ └── scrapy_demo/ │ │ │ ├── __init__.py │ │ │ ├── items.py │ │ │ ├── middlewares.py │ │ │ ├── middlewares_proxy_redis.py │ │ │ ├── pipelines.py │ │ │ ├── settings.py │ │ │ └── spiders/ │ │ │ ├── __init__.py │ │ │ └── example.py │ │ ├── server │ │ └── server.go │ ├── 2-6-gocolly/ │ │ └── README.md │ ├── 2-7-Docker-Nginx-antiClawer/ │ │ ├── README.md │ │ ├── deny_userAgent.conf │ │ ├── go_spider │ │ ├── go_spider.go │ │ ├── nginx1.conf │ │ └── server.go │ ├── 2-9-Chrome插件-全文检索/ │ │ └── README.md │ ├── 3-1-世界语言-翻译-Siri朗读/ │ │ ├── README.md │ │ ├── baidu_translate_api.py │ │ ├── config.py │ │ ├── macOS-siri-百度翻译-TTS.py │ │ └── py-调用macos内置的语音听写功能.py │ ├── 3-10-nonebot_Coolq_Docker/ │ │ └── README.md │ ├── 3-13-macOS-lock-screen/ │ │ ├── README.md │ │ ├── lockscreen.py │ │ └── suspend.py │ ├── 3-14-DNS查询/ │ │ └── README.md │ ├── 3-14-时间管理/ │ │ └── README.md │ ├── 3-16-GitHub-Free/ │ │ ├── README.md │ │ ├── proxy_list1 │ │ ├── proxy_list1.py │ │ └── verify_proxy.py │ ├── 3-16-企业微信/ │ │ ├── QYWX_APP/ │ │ │ ├── WXBizMsgCrypt.py │ │ │ ├── callback1.py │ │ │ ├── config.py │ │ │ ├── ierror.py │ │ │ └── 安装.md │ │ ├── README.md │ │ └── bot1.py │ ├── 3-17-Auto.js/ │ │ ├── Programer-Pay-Solution.md │ │ ├── README.md │ │ ├── 微信/ │ │ │ ├── 微信-收款码-输入金额-备注.js │ │ │ ├── 微信-收款码-输入金额-捕捉toast.js │ │ │ ├── 微信-收款码-输入金额.js │ │ │ ├── 微信1.js │ │ │ └── 收款码.js │ │ └── 打开QQ聊天.js │ ├── 3-18-Docker-PHP-dataoke/ │ │ ├── PHP/ │ │ │ ├── README.md │ │ │ └── nginx/ │ │ │ ├── conf/ │ │ │ │ └── conf.d/ │ │ │ │ └── php.conf │ │ │ └── www/ │ │ │ ├── index.html │ │ │ ├── index.php │ │ │ └── phpinfo.php │ │ └── README.md │ ├── 3-18-raspberry-pi-VScode/ │ │ ├── README.md │ │ └── request-ip.py │ ├── 3-2-Wikipedia/ │ │ └── README.md │ ├── 3-20-keyboard-man/ │ │ └── README.md │ ├── 3-23-douban-movie-chrome-extension/ │ │ ├── README.md │ │ └── extension/ │ │ ├── _locales/ │ │ │ ├── en/ │ │ │ │ └── messages.json │ │ │ └── zh_CN/ │ │ │ └── messages.json │ │ ├── css/ │ │ │ └── tab.css │ │ ├── js/ │ │ │ ├── background.js │ │ │ └── content.js │ │ └── manifest.json │ ├── 3-24-macOS-Python-Notification/ │ │ ├── README.md │ │ ├── bili_status_number.py │ │ └── macos_notify.py │ ├── 3-25-git-sourcetree-Fork/ │ │ └── README.md │ ├── 3-26-m3u8-decrypt/ │ │ └── README.md │ ├── 3-28-Python反向编程/ │ │ ├── README.md │ │ └── demo.py │ ├── 3-29-Chrome-History/ │ │ └── README.md │ ├── 3-30-程序员-邮件订阅/ │ │ └── README.md │ ├── 3-31-python-smart-device/ │ │ ├── README.md │ │ ├── broadlink1.py │ │ ├── 广播1.py │ │ └── 监听1.py │ ├── 3-4-WireShark-https-Decrypt/ │ │ └── README.md │ ├── 3-5-Python-Request-https-with-proxy/ │ │ ├── README.md │ │ ├── verify_https.go │ │ └── verify_https.py │ ├── 3-5-Ubuntu-install-Wine-run-Windows/ │ │ └── README.md │ ├── 3-6-macOS创建输入法/ │ │ ├── README.md │ │ ├── bili_utf16.inputplugin │ │ └── mac_canton_utf16.inputplugin │ ├── 3-7-web-proxy/ │ │ ├── README.md │ │ ├── demo1.py │ │ └── demo2.py │ ├── 3-9-DNS-server/ │ │ ├── README.md │ │ ├── dns_flask.py │ │ └── mini_dns_server.go │ ├── 4-1-mitmproxy-抖音/ │ │ └── README.md │ ├── 4-10-MCN-papi酱/ │ │ ├── README.md │ │ └── analysis.py │ ├── 4-2-今日头条-原创视频-收益/ │ │ └── README.md │ ├── 4-23-moviepy-GIF/ │ │ ├── README.md │ │ └── 跳绳-GIF动画.ipynb │ ├── 4-23-程小奔python/ │ │ ├── README.md │ │ └── 检测物体.py │ ├── 4-29-GoPro-MAX/ │ │ └── README.md │ ├── 4-3-Jupiter-Notebook-插入HTML视频/ │ │ ├── README.md │ │ └── html_video.ipynb │ ├── 4-8-instagram/ │ │ └── README.md │ ├── 5-4-movie-调查犯罪是我们的职业/ │ │ ├── Crime est notre affaire.subs.cn.srt │ │ ├── Crime est notre affaire.subs.eng.srt │ │ └── README.md │ ├── 6-17-Bird-Sound-crawl/ │ │ ├── README.md │ │ ├── data.py │ │ ├── download_sound.py │ │ ├── sound_proxy.py │ │ └── sounds/ │ │ └── download.ams.birds.cornell.edu/ │ │ └── api/ │ │ └── v1/ │ │ └── asset/ │ │ ├── 108015/ │ │ │ └── audio │ │ └── 109243711/ │ │ └── audio │ ├── 6-17-EXIF-GPS/ │ │ ├── README.md │ │ └── exif-gps.py │ ├── 6-22-iPad-Draw-on-Map/ │ │ └── README.md │ └── 7-30-PDF-decrypt/ │ ├── README.md │ ├── pdf_decrypt.py │ └── pdf_unlock.go ├── 2021/ │ ├── 1-19-macOS-Window-On-Top/ │ │ └── README.md │ ├── 1-24-desert-forest-destroyed/ │ │ └── README.md │ ├── 1-27-server-psutil/ │ │ ├── README.md │ │ └── server_report.py │ ├── 1-31-scapy-graph-svg/ │ │ ├── Graphviz/ │ │ │ ├── dot/ │ │ │ │ └── test.dot │ │ │ └── 生成动态路由轨迹图.ipynb │ │ └── README.md │ ├── 1-4-bilibili_api/ │ │ └── README.md │ ├── 1-5-github-markdown-html/ │ │ ├── README.md │ │ └── repo_markdown_html1.py │ ├── 2-23-great-code/ │ │ └── README.md │ ├── 2-24-movie-cut/ │ │ └── README.md │ ├── 2-28-GitHub-short-link/ │ │ ├── README.md │ │ ├── push_qrcode1.py │ │ └── short_link1.py │ ├── 3-13-chrome-book/ │ │ └── README.md │ ├── 3-15-wallpaper/ │ │ ├── README.md │ │ └── 壁纸/ │ │ ├── README.MD │ │ ├── goWP.go │ │ ├── wp1.go │ │ ├── wp1.py │ │ ├── wp2.go │ │ └── wp_macos │ ├── 3-17-VMagicMirror/ │ │ └── README.md │ ├── 3-19-Chrome-tabs/ │ │ ├── README.md │ │ └── TabGroups-shortcuts/ │ │ ├── README.md │ │ ├── background.js │ │ ├── hello.html │ │ └── manifest.json │ ├── 3-21-subtitle-rejust/ │ │ ├── README.md │ │ ├── cn2.srt │ │ ├── jl1.py │ │ ├── 从网站下载的简体.srt │ │ ├── 从视频分离的字幕.srt │ │ └── 调整后.srt │ ├── 3-7-m3u8-chrome/ │ │ ├── README.md │ │ ├── ffmpeg1.py │ │ └── youku1.py │ ├── 5-30-SMS-api/ │ │ ├── README.md │ │ └── sms_server.py │ ├── 5-30-puppeteer-REPL/ │ │ ├── README.md │ │ └── 在命令行里REPL/ │ │ ├── DEMO.JS │ │ ├── debug.js │ │ └── puppeteer-extra-plugin-repl.js │ ├── 6-19-list-groupby/ │ │ ├── README.md │ │ └── groupby.py │ ├── 7-11-Flask-Pydantic/ │ │ ├── README.md │ │ ├── fastapi_pydantic1.py │ │ └── flask_pydantic1.py │ ├── 7-25-Lorca/ │ │ ├── README.MD │ │ └── examples/ │ │ ├── counter/ │ │ │ ├── Example.app/ │ │ │ │ └── Contents/ │ │ │ │ ├── Info.plist │ │ │ │ ├── MacOS/ │ │ │ │ │ └── lorca-example │ │ │ │ └── Resources/ │ │ │ │ └── icon.icns │ │ │ ├── build-linux.sh │ │ │ ├── build-macos.sh │ │ │ ├── build-windows.bat │ │ │ ├── counter_win10 │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ ├── icons/ │ │ │ │ └── icon.icns │ │ │ ├── main.go │ │ │ └── www/ │ │ │ └── index.html │ │ ├── hello/ │ │ │ ├── hello_win10 │ │ │ ├── main.go │ │ │ └── main_macOS │ │ └── stopwatch/ │ │ ├── main.go │ │ ├── main_macOS │ │ └── stopwatch_win10 │ ├── 7-4-diskcache/ │ │ ├── README.md │ │ └── diskcache1.py │ ├── 8-1-deta-fastapi/ │ │ └── README.md │ ├── 8-15-Marp-ppt/ │ │ ├── README.MD │ │ ├── README.html │ │ ├── demo-完成.html │ │ ├── demo-完成.md │ │ ├── demo-完成2.html │ │ ├── demo-完成3.html │ │ ├── demo-完成4.html │ │ ├── demo-完成5.html │ │ ├── demo-完成6.html │ │ └── demo.md │ └── 9-3-Deta-Base/ │ ├── BaseDemo/ │ │ ├── config.py │ │ ├── main.py │ │ └── requirements.txt │ └── README.md └── README.md
SYMBOL INDEX (273 symbols across 90 files)
FILE: 2019/12-29-Docker-OpenCV-golang-gocv/facedetect-from-url/main.go
function main (line 28) | func main() {
FILE: 2019/12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/docker-h5.js
function on_response (line 35) | async function on_response(response) {
function run (line 63) | async function run() {
FILE: 2020/1-19-TTS语音合成/讯飞语音/tts_ws_python3_demo.py
class Ws_Param (line 40) | class Ws_Param(object):
method __init__ (line 42) | def __init__(self, APPID, APIKey, APISecret, Text):
method create_url (line 60) | def create_url(self):
function on_message (line 94) | def on_message(ws, message):
function on_error (line 120) | def on_error(ws, error):
function on_close (line 125) | def on_close(ws):
function on_open (line 130) | def on_open(ws):
FILE: 2020/1-19-TTS语音合成/讯飞语音/xf_service.py
class XFtts (line 24) | class XFtts(object):
method __init__ (line 26) | def __init__(self, APPID, APIKey, APISecret, ):
method create_url (line 45) | def create_url(self):
method say (line 79) | def say(self, sentens,speaker='xiaoxue'):#发音人
function tts_say_wave (line 143) | def tts_say_wave(wav_path,text):
function main (line 161) | def main():
FILE: 2020/1-3-特朗普-推特-截图/twitter_screenshot1.js
function run (line 9) | async function run() {
FILE: 2020/12-19-password-generator/password.py
function 不重复 (line 17) | def 不重复(size=6, chars=string.ascii_letters + string.digits):
function random_string_generator (line 27) | def random_string_generator(size=6, chars=string.ascii_letters + string....
function main (line 31) | def main(size):
FILE: 2020/12-21-python-hosts/add-host-ip.py
function 查询全球DNS (line 14) | def 查询全球DNS(host):
function 查询全球DNS2 (line 48) | def 查询全球DNS2(host):
function 检查本地能否连接该IP (line 80) | def 检查本地能否连接该IP(ip, host): # OK
function 检查本地能否连接该IP1 (line 106) | def 检查本地能否连接该IP1(ip):
function 检查本地能否连接该IP2 (line 125) | def 检查本地能否连接该IP2(ip):
function main (line 135) | def main(url):
FILE: 2020/2-18-Scrapy-auto-proxy/manage_proxy.py
function main (line 16) | def main():
function scan (line 40) | def scan():
FILE: 2020/2-19-JetBrains-Pycharm-破解/demo/demo.py
function f1 (line 9) | def f1():
FILE: 2020/2-19-JetBrains-Pycharm-破解/demo/t1.go
function main (line 12) | func main() {
FILE: 2020/2-20-Python-Siri-语音朗读文章/Global-hotkeys.py
function on_activate (line 15) | def on_activate():
function for_canonical (line 19) | def for_canonical(f):
function main (line 34) | def main():
FILE: 2020/2-20-Python-Siri-语音朗读文章/copy-string-tts.py
function get_listener (line 15) | def get_listener(key, voice):
function main (line 42) | def main():
FILE: 2020/2-20-Python-Siri-语音朗读文章/copy-string-tts2.py
function say (line 20) | def say(voice):
function on_activate_1 (line 31) | def on_activate_1():
function on_activate_2 (line 36) | def on_activate_2():
function on_activate_3 (line 39) | def on_activate_3():
function on_activate_4 (line 43) | def on_activate_4():
function main (line 50) | def main():
FILE: 2020/2-20-Python-Siri-语音朗读文章/keyboard_Listener1.py
function on_press (line 12) | def on_press(key):
function on_release (line 21) | def on_release(key):
FILE: 2020/2-22-Scrapy-Puppeteer-Js/demo/demo/items.py
class DemoItem (line 11) | class DemoItem(scrapy.Item):
FILE: 2020/2-22-Scrapy-Puppeteer-Js/demo/demo/middlewares.py
class Puppeteer (line 11) | class Puppeteer(object):
method from_crawler (line 13) | def from_crawler(cls, crawler):
method __init__ (line 19) | def __init__(self, crawler):
method process_request (line 22) | def process_request(self, request, spider):
method process_response (line 29) | def process_response(self, request, response, spider):
class DemoSpiderMiddleware (line 35) | class DemoSpiderMiddleware(object):
method from_crawler (line 41) | def from_crawler(cls, crawler):
method process_spider_input (line 47) | def process_spider_input(self, response, spider):
method process_spider_output (line 54) | def process_spider_output(self, response, result, spider):
method process_spider_exception (line 62) | def process_spider_exception(self, response, exception, spider):
method process_start_requests (line 70) | def process_start_requests(self, start_requests, spider):
method spider_opened (line 79) | def spider_opened(self, spider):
class DemoDownloaderMiddleware (line 83) | class DemoDownloaderMiddleware(object):
method from_crawler (line 89) | def from_crawler(cls, crawler):
method process_request (line 95) | def process_request(self, request, spider):
method process_response (line 107) | def process_response(self, request, response, spider):
method process_exception (line 116) | def process_exception(self, request, exception, spider):
method spider_opened (line 126) | def spider_opened(self, spider):
FILE: 2020/2-22-Scrapy-Puppeteer-Js/demo/demo/pipelines.py
class DemoPipeline (line 9) | class DemoPipeline(object):
method process_item (line 10) | def process_item(self, item, spider):
FILE: 2020/2-22-Scrapy-Puppeteer-Js/demo/demo/spiders/example.py
class ExampleSpider (line 5) | class ExampleSpider(scrapy.Spider):
method parse (line 10) | def parse(self, response):
FILE: 2020/2-22-Scrapy-Puppeteer-Js/js_server.go
function main (line 16) | func main() {
FILE: 2020/2-22-Scrapy-Puppeteer-Js/js_server.py
function index (line 14) | def index():
FILE: 2020/2-23-压力测试-locust/locust-get.py
function get (line 15) | def get(l):
class UserTasks (line 19) | class UserTasks(TaskSet):
class WebsiteUser (line 29) | class WebsiteUser(HttpLocust):
FILE: 2020/2-23-压力测试-locust/locust_file.py
function login (line 11) | def login(l):
function logout (line 14) | def logout(l):
function index (line 17) | def index(l):
function profile (line 20) | def profile(l):
class UserBehavior (line 23) | class UserBehavior(TaskSet):
FILE: 2020/2-23-压力测试-locust/server.go
function main (line 24) | func main() {
function hello (line 33) | func hello(req *restful.Request, resp *restful.Response) {
type Article (line 39) | type Article struct
FILE: 2020/2-24-Go-Module/demo/a.go
function main (line 16) | func main() {
FILE: 2020/2-24-Go-Module/demo/dir1/b2.go
function T1 (line 10) | func T1() {
FILE: 2020/2-26-Go_Proxy_server/proxy_server.go
function main (line 32) | func main() {
function handleClientRequest (line 51) | func handleClientRequest(client net.Conn) {
FILE: 2020/2-26-多点签到领积分/demo1.py
function main (line 10) | def main():
FILE: 2020/2-5-TTS-Moviepy/TTS/xf_service.py
class XFtts (line 24) | class XFtts(object):
method __init__ (line 26) | def __init__(self, APPID, APIKey, APISecret, ):
method create_url (line 45) | def create_url(self):
method say (line 79) | def say(self, sentens,speaker='xiaoxue'):#发音人
function tts_say_wave (line 143) | def tts_say_wave(wav_path,text):
function main (line 161) | def main():
FILE: 2020/2-6-Spider-Speed-test/go_spider.go
function main (line 15) | func main() {
FILE: 2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/items.py
class ScrapyDemoItem (line 11) | class ScrapyDemoItem(scrapy.Item):
FILE: 2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/middlewares.py
class ScrapyDemoSpiderMiddleware (line 11) | class ScrapyDemoSpiderMiddleware(object):
method from_crawler (line 17) | def from_crawler(cls, crawler):
method process_spider_input (line 23) | def process_spider_input(self, response, spider):
method process_spider_output (line 30) | def process_spider_output(self, response, result, spider):
method process_spider_exception (line 38) | def process_spider_exception(self, response, exception, spider):
method process_start_requests (line 46) | def process_start_requests(self, start_requests, spider):
method spider_opened (line 55) | def spider_opened(self, spider):
class ScrapyDemoDownloaderMiddleware (line 59) | class ScrapyDemoDownloaderMiddleware(object):
method from_crawler (line 65) | def from_crawler(cls, crawler):
method process_request (line 71) | def process_request(self, request, spider):
method process_response (line 83) | def process_response(self, request, response, spider):
method process_exception (line 92) | def process_exception(self, request, exception, spider):
method spider_opened (line 102) | def spider_opened(self, spider):
FILE: 2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/middlewares_proxy_redis.py
class redisProxy (line 20) | class redisProxy(object):
method from_crawler (line 22) | def from_crawler(cls, crawler):
method __init__ (line 29) | def __init__(self, crawler):
method process_request (line 35) | def process_request(self, request, spider):
method process_response (line 49) | def process_response(self, request, response, spider):
method process_exception (line 72) | def process_exception(self, request, exception, spider):
FILE: 2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/pipelines.py
class ScrapyDemoPipeline (line 9) | class ScrapyDemoPipeline(object):
method process_item (line 10) | def process_item(self, item, spider):
FILE: 2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/spiders/example.py
class ExampleSpider (line 15) | class ExampleSpider(scrapy.Spider):
method parse (line 22) | def parse(self, response):
FILE: 2020/2-6-Spider-Speed-test/server.go
function main (line 25) | func main() {
function hello (line 33) | func hello(req *restful.Request, resp *restful.Response) {
type Article (line 39) | type Article struct
FILE: 2020/2-7-Docker-Nginx-antiClawer/go_spider.go
function main (line 15) | func main() {
FILE: 2020/2-7-Docker-Nginx-antiClawer/server.go
function main (line 27) | func main() {
function hello (line 37) | func hello(req *restful.Request, resp *restful.Response) {
type Article (line 43) | type Article struct
FILE: 2020/3-1-世界语言-翻译-Siri朗读/baidu_translate_api.py
function translate (line 32) | def translate(sub, froml=None, tol='zh'):
function test (line 54) | def test():
FILE: 2020/3-1-世界语言-翻译-Siri朗读/macOS-siri-百度翻译-TTS.py
function say (line 51) | def say(voice, text):
function main (line 65) | def main():
FILE: 2020/3-13-macOS-lock-screen/lockscreen.py
function lock (line 14) | def lock():
FILE: 2020/3-13-macOS-lock-screen/suspend.py
function lock (line 18) | def lock():
FILE: 2020/3-16-GitHub-Free/proxy_list1.py
function main (line 17) | def main():
function get_proxy (line 38) | def get_proxy():
FILE: 2020/3-16-GitHub-Free/verify_proxy.py
function verify (line 16) | def verify(proxy: str):
function main (line 41) | def main():
FILE: 2020/3-16-企业微信/QYWX_APP/WXBizMsgCrypt.py
class FormatException (line 20) | class FormatException(Exception):
function throw_exception (line 23) | def throw_exception(message, exception_class=FormatException):
function generateNonce (line 27) | def generateNonce(digits = 16):
class SHA1 (line 35) | class SHA1:
method getSHA1 (line 38) | def getSHA1(self, token, timestamp, nonce, encrypt):
class XMLParse (line 57) | class XMLParse:
method extract (line 68) | def extract(self, xmltext):
method generate (line 81) | def generate(self, encrypt, signature, timestamp, nonce):
class ResponseMessage (line 98) | class ResponseMessage():
method __init__ (line 168) | def __init__(self,data_dict):
method xml (line 175) | def xml(self):
class PKCS7Encoder (line 202) | class PKCS7Encoder():
method encode (line 206) | def encode(self, text):
method decode (line 222) | def decode(self, decrypted):
class Prpcrypt (line 233) | class Prpcrypt(object):
method __init__ (line 236) | def __init__(self,key):
method encrypt (line 244) | def encrypt(self,text,receiveid):
method decrypt (line 266) | def decrypt(self,text,receiveid):
class WXBizMsgCrypt (line 297) | class WXBizMsgCrypt(object):
method __init__ (line 299) | def __init__(self,sToken,sEncodingAESKey,sReceiveId):
method VerifyURL (line 317) | def VerifyURL(self, sMsgSignature, sTimeStamp, sNonce, sEchoStr):
method EncryptMsg (line 329) | def EncryptMsg(self, sReplyMsg, sNonce, timestamp = None):
method DecryptMsg (line 350) | def DecryptMsg(self, sPostData, sMsgSignature, sTimeStamp, sNonce):
FILE: 2020/3-16-企业微信/QYWX_APP/callback1.py
function hello_world (line 21) | def hello_world():
function weixin (line 27) | def weixin():
function reply (line 58) | def reply():
class ResponseMessage (line 110) | class ResponseMessage():
method __init__ (line 180) | def __init__(self, data_dict):
method xml (line 187) | def xml(self):
FILE: 2020/3-16-企业微信/bot1.py
function main (line 9) | def main():
FILE: 2020/3-17-Auto.js/微信/微信-收款码-输入金额-备注.js
function tLog (line 6) | function tLog(msg) {
FILE: 2020/3-17-Auto.js/微信/微信-收款码-输入金额-捕捉toast.js
function create (line 41) | function create(price) {
FILE: 2020/3-18-Docker-PHP-dataoke/PHP/nginx/www/index.php
function gzdecode (line 200) | function gzdecode($data)
class HttpHelper (line 243) | class HttpHelper
method __construct (line 254) | public function __construct($appId, $key, $proxyVersion, $documentUrl)
method getFastUrl (line 265) | public function getFastUrl()
method hostToIp (line 297) | public function hostToIp($host){
method getIp (line 324) | public function getIp($host,$re_try = false){
method getHtml (line 383) | public function getHtml($url, $requestUrl, $param = array(), $method =...
method php_self (line 653) | function php_self(){
method upgrade (line 664) | protected function upgrade()
method get_real_ip (line 701) | function get_real_ip()
method getIsAjaxRequest (line 721) | public function getIsAjaxRequest()
method setHttpResponseCode (line 726) | public function setHttpResponseCode($code)
class CacheHelper (line 849) | class CacheHelper
method __construct (line 853) | public function __construct()
method Set (line 862) | public function Set($key, $value, $expire = 360)
method Get (line 873) | public function Get($key)
method isHttps (line 893) | public static function isHttps()
method isMobile (line 898) | static function isMobile()
method clean (line 904) | public function clean()
method isWeibo (line 918) | static function isWeibo()
method isMicroMessenger (line 923) | static function isMicroMessenger()
method isIPhone (line 929) | static function isIPhone()
method isIPad (line 935) | static function isIPad()
method isSpider (line 941) | static function isSpider()
FILE: 2020/3-18-raspberry-pi-VScode/request-ip.py
function main (line 14) | def main():
FILE: 2020/3-24-macOS-Python-Notification/bili_status_number.py
function bili_stat (line 22) | def bili_stat():
function main (line 40) | def main():
FILE: 2020/3-24-macOS-Python-Notification/macos_notify.py
function notify (line 17) | def notify(title, text):
function main (line 23) | def main():
FILE: 2020/3-28-Python反向编程/demo.py
function main (line 12) | def main():
function verify (line 16) | def verify(ip, port):
FILE: 2020/3-31-python-smart-device/broadlink1.py
function main2 (line 17) | def main2():
function main (line 68) | def main():
FILE: 2020/3-31-python-smart-device/广播1.py
function main (line 22) | def main():
function main2 (line 34) | def main2():
function main3 (line 39) | def main3():
function main4 (line 49) | def main4():
FILE: 2020/3-31-python-smart-device/监听1.py
function main (line 36) | def main():
FILE: 2020/3-5-Python-Request-https-with-proxy/verify_https.go
function main (line 19) | func main() {
FILE: 2020/3-5-Python-Request-https-with-proxy/verify_https.py
function main (line 10) | def main():
FILE: 2020/3-7-web-proxy/demo1.py
function main (line 13) | def main():
FILE: 2020/3-7-web-proxy/demo2.py
function main (line 11) | def main():
FILE: 2020/3-9-DNS-server/dns_flask.py
function hello_world (line 16) | def hello_world():
function dns (line 25) | def dns():
FILE: 2020/3-9-DNS-server/mini_dns_server.go
type handler (line 43) | type handler struct
method ServeDNS (line 45) | func (this *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
function main (line 85) | func main() {
FILE: 2020/4-10-MCN-papi酱/analysis.py
function get网红 (line 12) | def get网红(idx):
function main (line 35) | def main():
function main2 (line 81) | def main2():
FILE: 2020/4-23-程小奔python/检测物体.py
function on_start (line 6) | def on_start():
function on_button_a_pressed (line 11) | def on_button_a_pressed():
function on_button_b_pressed1 (line 22) | def on_button_b_pressed1():
function on_button_c_pressed2 (line 28) | def on_button_c_pressed2():
FILE: 2020/6-17-Bird-Sound-crawl/download_sound.py
function createfiles (line 17) | def createfiles(filepathname):
function cbk (line 24) | def cbk(a,b,c):
function main (line 37) | def main():
FILE: 2020/6-17-Bird-Sound-crawl/sound_proxy.py
class sound (line 20) | class sound:
method request (line 21) | def request(self, flow: HTTPFlow):
FILE: 2020/7-30-PDF-decrypt/pdf_decrypt.py
function t1 (line 9) | def t1():
function 加密 (line 17) | def 加密():
function 解密 (line 35) | def 解密():
FILE: 2020/7-30-PDF-decrypt/pdf_unlock.go
function main (line 17) | func main() {
function unlockPdf (line 36) | func unlockPdf(inputPath string, outputPath string, password string) err...
FILE: 2021/1-27-server-psutil/server_report.py
function cpu_percent (line 12) | def cpu_percent():
function main (line 67) | def main():
FILE: 2021/1-5-github-markdown-html/repo_markdown_html1.py
function main (line 17) | def main():
FILE: 2021/2-28-GitHub-short-link/push_qrcode1.py
function QRCode (line 20) | def QRCode(text):
function main (line 42) | def main(text, path=None):
FILE: 2021/2-28-GitHub-short-link/short_link1.py
function main (line 23) | def main(url, path=None):
FILE: 2021/3-15-wallpaper/壁纸/wp1.go
function main (line 10) | func main() {
FILE: 2021/3-15-wallpaper/壁纸/wp1.py
function main (line 32) | def main():
FILE: 2021/3-15-wallpaper/壁纸/wp2.go
function getWp (line 14) | func getWp() string { //获取壁纸图片地址
function main (line 28) | func main() {
FILE: 2021/3-19-Chrome-tabs/TabGroups-shortcuts/background.js
constant CREATE_NEW_GROUP (line 1) | const CREATE_NEW_GROUP = "create_new_group_with_current_tab";
constant ADD_TO_GROUP (line 2) | const ADD_TO_GROUP = "add_to_group";
FILE: 2021/3-21-subtitle-rejust/jl1.py
function main (line 40) | def main():
FILE: 2021/3-7-m3u8-chrome/ffmpeg1.py
function main (line 10) | def main():
FILE: 2021/3-7-m3u8-chrome/youku1.py
function main (line 19) | def main(url):
function merge_file (line 50) | def merge_file():
function main2 (line 64) | def main2(url):
FILE: 2021/5-30-SMS-api/sms_server.py
function get_verify (line 20) | def get_verify():
function sms (line 53) | def sms():
function index (line 124) | def index():
FILE: 2021/5-30-puppeteer-REPL/在命令行里REPL/DEMO.JS
function run (line 19) | async function run(params) {//不行
FILE: 2021/5-30-puppeteer-REPL/在命令行里REPL/debug.js
function run (line 27) | async function run() {
FILE: 2021/6-19-list-groupby/groupby.py
function g (line 52) | def g(x): # 自定义分组key
FILE: 2021/7-11-Flask-Pydantic/fastapi_pydantic1.py
class People (line 20) | class People(BaseModel):
function insert (line 28) | def insert(people: People):
FILE: 2021/7-11-Flask-Pydantic/flask_pydantic1.py
class QueryModel (line 34) | class QueryModel(BaseModel):
class People (line 39) | class People(BaseModel):
function insert (line 48) | def insert(body: People, query: QueryModel):
function insert0 (line 57) | def insert0():
function insert2 (line 67) | def insert2():
function main (line 80) | def main():
FILE: 2021/7-25-Lorca/examples/counter/main.go
type counter (line 32) | type counter struct
method Add (line 37) | func (c *counter) Add(n int) {
method Value (line 43) | func (c *counter) Value() int {
function main (line 49) | func main() {
FILE: 2021/7-25-Lorca/examples/hello/main.go
function main (line 22) | func main() {
FILE: 2021/7-25-Lorca/examples/stopwatch/main.go
function main (line 25) | func main() {
FILE: 2021/7-4-diskcache/diskcache1.py
function get_ip (line 17) | def get_ip(a): # 需要很多计算,计算一次就可以了
function main (line 26) | def main():
FILE: 2021/9-3-Deta-Base/BaseDemo/main.py
class Item (line 25) | class Item(BaseModel):
function read_root (line 32) | def read_root():
function put_item (line 37) | def put_item(item: Item):
function read_item (line 46) | def read_item(key: str): # 1orwum5g2grm
function update_item (line 53) | def update_item(item: Item):
function delete_item (line 62) | def delete_item(key: str):
Condensed preview — 309 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,198K chars).
[
{
"path": ".gitignore",
"chars": 1823,
"preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
},
{
"path": "2019/12-16-Github-Pull-requests-gocolly/Github-Pull-requests-gocolly.md",
"chars": 3193,
"preview": "- 使用gocolly爬虫,想统计抓取情况发现不方便,所以自己修改colly.go写了一个方法Statistics\n - https://github.com/gocolly/colly/issues/411\n- 参考\n - ["
},
{
"path": "2019/12-18-Caddy搭建Google镜像-反向代理/Caddy搭建Google镜像-反向代理.md",
"chars": 910,
"preview": "- 官网\n - https://github.com/caddyserver/caddy\n - 下载 https://caddyserver.com/v1/download\n- 视频 https://www.bilibili.c"
},
{
"path": "2019/12-26-用docker模拟Nginx限制同一个爬虫ip的访问频率/用docker模拟Nginx限制同一个爬虫ip的访问频率.md",
"chars": 974,
"preview": "# 用docker模拟Nginx限制同一个爬虫ip的访问频率\n\n- Nginx配置\nhttps://blog.csdn.net/weixin_34341117/article/details/85848963\n使用golang的tollbo"
},
{
"path": "2019/12-29-Docker-OpenCV-golang-gocv/README.md",
"chars": 3516,
"preview": "# 使用docker运行OpenCV+golang\n- 参考\n - https://github.com/hybridgroup/gocv\n - https://hub.docker.com/r/hybridgroup/gocv"
},
{
"path": "2019/12-29-Docker-OpenCV-golang-gocv/facedetect-from-url/main.go",
"chars": 1929,
"preview": "// What it does:\n//\n// This example uses the CascadeClassifier class to detect faces from url,\n// and draw a rectangle a"
},
{
"path": "2019/12-30-Docker-Puppeteer抓取动态页面/README.md",
"chars": 1858,
"preview": "# Docker+Puppeteer抓取动态页面\n- 视频 https://www.bilibili.com/video/av81253564/\n\n### 问题\n爬虫怎样抓取Js动态页面?例如电商网站的价格,销量\n\n## 常规解决方案\n安装"
},
{
"path": "2019/12-30-Docker-Puppeteer抓取动态页面/puppeteer/docker-puppeteer-pdf.js",
"chars": 567,
"preview": "/*\n\n运行\ndocker run --shm-size 1G --rm -v /Users/play/Temp/puppeteer/docker-puppeteer-pdf.js:/app/index.js -v /Users/play/"
},
{
"path": "2019/12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/README.md",
"chars": 618,
"preview": "\n# 12-31-Ubuntu-docker-puppeteer-刷B站视频播放量\n\n- 首先在Ubuntu服务器上安装docker.io\n\t- 参考 https://docs.docker.com/install/linux/docker"
},
{
"path": "2019/12-31-Ubuntu-docker-puppeteer-刷B站视频播放量/docker-h5.js",
"chars": 3999,
"preview": "/**\n * Created by play on 2019/8/24.\n先安装node\n再运行\nnpm install -g puppeteer\n然后\nnode docker-h5.js\n\nDocker运行\ndocker rm bili\n"
},
{
"path": "2020/1-19-TTS语音合成/README.md",
"chars": 516,
"preview": "## TTS 从文本到语音(TextToSpeech) 语音合成\n\n- 视频 [想要鬼畜素材,【TTS语音合成】来帮你,哈哈哈](https://www.bilibili.com/video/av84082965)\n- macos say\n"
},
{
"path": "2020/1-19-TTS语音合成/讯飞语音/config.py",
"chars": 152,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020-01-18 20:29\n# @File : config.py\n\n\n\"\"\"\nconfig.py:\n\"\"\"\n\nAPPID = 'xxx'\nAPIKey "
},
{
"path": "2020/1-19-TTS语音合成/讯飞语音/tts_ws_python3_demo.py",
"chars": 5243,
"preview": "# -*- coding:utf-8 -*-\r\n#\r\n# 播放 /Applications/VLC.app/Contents/MacOS/VLC --demux=rawaud --rawaud-channels 1 --rawaud-sa"
},
{
"path": "2020/1-19-TTS语音合成/讯飞语音/xf_service.py",
"chars": 5904,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020-01-18 20:25\n# @File : xf_service.py\n\n\n\"\"\"\nxf_service.py:\n\"\"\"\n\n# import webs"
},
{
"path": "2020/1-20-hacker-tools/README.md",
"chars": 453,
"preview": "## Docker黑客工具\n- 视频:[一行命令让你成为黑客高手!!!Docker黑客工具](https://www.bilibili.com/video/av84227396/)\n\n- https://hub.docker.com/r/v"
},
{
"path": "2020/1-3-特朗普-推特-截图/README.md",
"chars": 119,
"preview": "# 特朗普-推特-截图\n\n- 首先要使用代理\n - args: ['--proxy-server=127.0.0.1:8118'],\n- 然后page.goto(main_url)\n- 使用selector获取【推文】元素\n- 截图"
},
{
"path": "2020/1-3-特朗普-推特-截图/twitter_screenshot1.js",
"chars": 1546,
"preview": "/*\n\n要使用代理执行\n*/\nconst puppeteer = require('puppeteer');\nvar main_url='https://twitter.com/realDonaldTrump'\n\n\nasync functi"
},
{
"path": "2020/10-9-weShare-ink-display/README.md",
"chars": 3509,
"preview": "## 微雪-墨水屏-编程\n\n## 视频\n- [微雪墨水屏-Arduino编程,ESP32 支持WiFi和蓝牙](https://www.bilibili.com/video/BV1yz4y1C7Y8/)\n\n## 购买\n- 淘宝,运费6元\n "
},
{
"path": "2020/11-25-use-Search-engine/README.md",
"chars": 1036,
"preview": "# 怎样使用搜索引擎\n\n- 视频 [【实践】怎样使用搜索引擎?代替Google](https://www.bilibili.com/video/BV1UD4y1X7xm/)\n\n## 国内\n- 不要使用百度\n- 使用微软bing\n - "
},
{
"path": "2020/12-17-Azure-server-free/README.md",
"chars": 3371,
"preview": "## 免费Azure服务器\n\n- 视频 [【亲测有效】申请微软Azure服务器免费12个月](https://www.bilibili.com/video/BV12p4y1q7t7/)\n\n- 参考\n - [申请微软Azure服务免费1"
},
{
"path": "2020/12-19-password-generator/README.md",
"chars": 425,
"preview": "## Python密码生成器\n\n- 视频 [Python密码生成器,轻松实现](https://www.bilibili.com/video/BV1sf4y1e7gk/)\n\n- 参考\n - https://github.com/red"
},
{
"path": "2020/12-19-password-generator/password.py",
"chars": 879,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/12/19 13:29\n# @File : password.py\n\n\n\"\"\"\npassword.py:\npassword-generator\n快捷方"
},
{
"path": "2020/12-21-python-hosts/README.md",
"chars": 622,
"preview": "\n## 用来翻墙\n\n- 视频 [Python 工具库python-hosts的使用](https://www.bilibili.com/video/BV1y5411G7Kj/)\n- 代码\n - [add-host-ip.py](add"
},
{
"path": "2020/12-21-python-hosts/add-host-ip.py",
"chars": 5268,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/12/21 11:56\n# @File : add-host-ip.py\n\n\n\"\"\"\nadd-host-ip.py:\n自动添加/etc/hosts 域"
},
{
"path": "2020/12-21-requests-toolbelt/README.md",
"chars": 430,
"preview": "## python requests toolbelt 工具带的使用\n\n- 视频 [python requests toolbelt 工具带的使用](https://www.bilibili.com/video/BV1rh411Z73N/)"
},
{
"path": "2020/12-22-PyGithub/README.md",
"chars": 807,
"preview": "## Github API 的使用-PyGithub\n\n- 视频 [Github API 的使用-PyGithub](https://www.bilibili.com/video/BV1fh411Z777/)\n\n- 参考\n - 第一个"
},
{
"path": "2020/12-4-chrome-enable-network-request-blocking/README.md",
"chars": 672,
"preview": "\n## 创建Chrome扩展程序以阻止网站请求\n- 视频 [【经验】开发Chrome插件,浏览器禁止某些网络请求,更快加载国外的网站](https://www.bilibili.com/video/BV1TT4y1M72r/) \n\n- 代"
},
{
"path": "2020/12-5-flask-ffmpeg-m3u8/README.md",
"chars": 1065,
"preview": "## Python编程,Flask网站播放m3u8流媒体\n\n- 视频 [【Python编程】Flask网站播放m3u8流媒体](https://www.bilibili.com/video/BV15K4y1L7nF/)\n\n- 步骤\n "
},
{
"path": "2020/2-1-WordCloud-武汉/README.md",
"chars": 142,
"preview": "- 视频:[怎样用Python制作【词云】?武汉-冠状病毒](https://www.bilibili.com/video/av86091936/)\n\n从【微博搜索】获取【热门微博】\n然后用【结巴分词】提取关键词\n使用Wordcloud制作"
},
{
"path": "2020/2-1-WordCloud-武汉/词云-Alice-英文.ipynb",
"chars": 236793,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 参考 https://github.com/amueller/wo"
},
{
"path": "2020/2-1-WordCloud-武汉/词云wordcloud-中文.ipynb",
"chars": 184314,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"中文\"\n ]\n },\n {\n \"cell_type\": \""
},
{
"path": "2020/2-12-Elasticsearch-Chrome/README.md",
"chars": 2482,
"preview": "- 视频 [使用Elasticsearch为Chrome插件增强搜索功能-中文分词](https://www.bilibili.com/video/av88390156/)\n\n- 参考\n - [Elasticsearch通过docke"
},
{
"path": "2020/2-12-Elasticsearch-Chrome/分词.md",
"chars": 5181,
"preview": "\n- IK分词\n - [Elasticsearch入门和查询语法分析(ik中文分词)](https://www.cnblogs.com/johnson108178/p/9295737.html)\n\n```\n(.py3) localho"
},
{
"path": "2020/2-13-微博实时抓取/README.md",
"chars": 472,
"preview": "# 微博实时抓取\n\n- 视频 [想第一时间看到爱豆的动态吗?快来学【微博实时抓取】吧](https://www.bilibili.com/video/av89008576/)\n\n- 参考 \n - https://github.com/"
},
{
"path": "2020/2-17-Python-secrets/README.md",
"chars": 2676,
"preview": "## Python的秘密\n\n- 视频 [Python的秘密,你知道吗?Python之禅](https://www.bilibili.com/video/av89586065/)\n\n- Python之禅 \n - import this\n"
},
{
"path": "2020/2-18-Docker-Go-goProxy/README.md",
"chars": 7161,
"preview": "- 视频 [本地开发环境不能用了?Docker帮你实现Go的独立编译环境](https://www.bilibili.com/video/av89812800/)\n\n- 本地开发环境损坏\n- 使用Docker作为Go工程的打包编译环境\n\n打"
},
{
"path": "2020/2-18-Scrapy-auto-proxy/README.md",
"chars": 1783,
"preview": "# Scrapy 爬虫自动调整IP代理\n- 视频 [Scrapy爬虫自动调整IP代理,避免失效](https://www.bilibili.com/video/av89959782/)\n- 问题\n - IP代理失效\n \n "
},
{
"path": "2020/2-18-Scrapy-auto-proxy/manage_proxy.py",
"chars": 1281,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/2/18 20:20\n# @File : manage_proxy.py\n\n\n\"\"\"\nmanage_proxy.py:\n\"\"\"\nimport redi"
},
{
"path": "2020/2-19-JetBrains-Pycharm-破解/README.md",
"chars": 1515,
"preview": "# JetBrains全家桶 破解\n\n- 视频 [JetBrains全家桶用不了?用VScode代替PyCharm](https://www.bilibili.com/video/av90073564/)\n\n- 常用 PyCharm 、G"
},
{
"path": "2020/2-19-JetBrains-Pycharm-破解/demo/.vscode/launch.json",
"chars": 532,
"preview": "{\n // 使用 IntelliSense 了解相关属性。 \n // 悬停以查看现有属性的描述。\n // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=83038"
},
{
"path": "2020/2-19-JetBrains-Pycharm-破解/demo/demo.py",
"chars": 244,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : demo.py\n@Time : 2020/02/19 10:49:37\n@Author : play4fun\n@Desc : \n"
},
{
"path": "2020/2-19-JetBrains-Pycharm-破解/demo/go.mod",
"chars": 30,
"preview": "module example.com/m\n\ngo 1.13\n"
},
{
"path": "2020/2-19-JetBrains-Pycharm-破解/demo/t1.go",
"chars": 244,
"preview": "/*\n@File : t1.go\n@Time : 2020/02/18 17:36:24\n@Author : play4fun\n@Desc : d\n*/\n\npackage main\n\nimport \"fm"
},
{
"path": "2020/2-20-Python-Siri-语音朗读文章/Global-hotkeys.py",
"chars": 654,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/2/20 17:50\n# @File : Global-hotkeys.py\n\n\n\"\"\"\nGlobal-hotkeys.py: 全局热键\n\n只支持一对"
},
{
"path": "2020/2-20-Python-Siri-语音朗读文章/README.md",
"chars": 404,
"preview": "# python-切换Siri的发音人-朗读文章\n\n- 视频 [Python-切换Siri的发音人-朗读文章,不需要手动切换发音人](https://www.bilibili.com/video/av90408293/)\n\n- 监控键盘,模"
},
{
"path": "2020/2-20-Python-Siri-语音朗读文章/copy-string-tts.py",
"chars": 1094,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/2/20 18:00\n# @File : copy-string-tts.py\n\n\n\"\"\"\ncopy-string-tts.py:\n\"\"\"\n\nfrom"
},
{
"path": "2020/2-20-Python-Siri-语音朗读文章/copy-string-tts2.py",
"chars": 1264,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/2/20 18:14\n# @File : copy-string-tts2.py\n\n\n\"\"\"\ncopy-string-tts2.py:\n支持多对热键\n"
},
{
"path": "2020/2-20-Python-Siri-语音朗读文章/keyboard_Listener1.py",
"chars": 727,
"preview": "# coding=utf-8\n\n'''\n\nhttps://pypi.org/project/keyboard/\n\n'''\n\nfrom pynput import keyboard\n\n\ndef on_press(key):\n try:\n"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/README.md",
"chars": 5131,
"preview": "## Scrapy使用Puppeteer中间件抓取JS动态页面\n- 视频 [有瓶颈!Scrapy使用Puppeteer中间件抓取JS动态页面](https://www.bilibili.com/video/av91039863/)\n\n##"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/items.py",
"chars": 285,
"preview": "# -*- coding: utf-8 -*-\n\n# Define here the models for your scraped items\n#\n# See documentation in:\n# https://docs.scrapy"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/middlewares.py",
"chars": 4300,
"preview": "# -*- coding: utf-8 -*-\n\n# Define here the models for your spider middleware\n#\n# See documentation in:\n# https://docs.sc"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/pipelines.py",
"chars": 286,
"preview": "# -*- coding: utf-8 -*-\n\n# Define your item pipelines here\n#\n# Don't forget to add your pipeline to the ITEM_PIPELINES s"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/settings.py",
"chars": 3041,
"preview": "# -*- coding: utf-8 -*-\n\n# Scrapy settings for demo project\n#\n# For simplicity, this file contains only settings conside"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/spiders/__init__.py",
"chars": 161,
"preview": "# This package will contain the spiders of your Scrapy project\n#\n# Please refer to the documentation for information on "
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/demo/spiders/example.py",
"chars": 813,
"preview": "# -*- coding: utf-8 -*-\nimport scrapy\nfrom scrapy import Request\n\nclass ExampleSpider(scrapy.Spider):\n name = 'exampl"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/main.py",
"chars": 303,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/2/21 18:03\n# @File : main.py\n\n\n\"\"\"\nmain.py: 在pycharm或vscode里单步调试\n\"\"\"\n\nfrom "
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/demo/scrapy.cfg",
"chars": 251,
"preview": "# Automatically created by: scrapy startproject\n#\n# For more information about the [deploy] section see:\n# https://scrap"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/docker-puppeteer-index.js",
"chars": 2610,
"preview": "'use strict'\n\nconst express = require('express')\nconst qs = require('qs')\nconst { URL } = require('url')\nconst contentDi"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/index.html",
"chars": 1289,
"preview": "<html>\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n <title>{{.Title}"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/js_server.go",
"chars": 576,
"preview": "/*\n@File : js_server.go\n@Time : 2020/02/22 11:32:32\n@Author : play4fun\n@Desc : d\n*/\n\npackage main\n\nimp"
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/js_server.py",
"chars": 447,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : js_server.py\n@Time : 2020/02/23 09:53:30\n@Author : play4fun\n@Desc "
},
{
"path": "2020/2-22-Scrapy-Puppeteer-Js/templates/index.html",
"chars": 1287,
"preview": "<html>\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n <title>{{Title}}"
},
{
"path": "2020/2-23-压力测试-locust/README.md",
"chars": 695,
"preview": "# 2-23-压力测试-locust\n\n- 视频 [蝗虫来袭!你的服务器顶得住【压力测试】吗?locust](https://www.bilibili.com/video/av91066346/)\n\n- 参考 \n - [locust"
},
{
"path": "2020/2-23-压力测试-locust/locust-get.py",
"chars": 543,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : locust-get.py\n@Time : 2020/02/23 12:11:51\n@Author : play4fun\n@Desc "
},
{
"path": "2020/2-23-压力测试-locust/locust_file.py",
"chars": 515,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : locust_file.py\n@Time : 2020/02/23 12:06:03\n@Author : play4fun\n@Desc "
},
{
"path": "2020/2-23-压力测试-locust/server.go",
"chars": 739,
"preview": "/*\n\n对比 Python 和 Go 语言的每秒请求数\nhttps://www.oschina.net/translate/python-vs-go-requests-per-second\n\n\ncurl http://127.0.0.1:8"
},
{
"path": "2020/2-24-Go-Module/README.md",
"chars": 1717,
"preview": "# Go Module 包管理\n- 视频 [Go-Module包管理,怎样import子文件夹的变量或函数?](https://www.bilibili.com/video/av91313893/)\n\n- 参考\n - [Go Mod"
},
{
"path": "2020/2-24-Go-Module/demo/a.go",
"chars": 408,
"preview": "/*\n@File : a.go\n@Time : 2020/02/24 11:42:20\n@Author : play4fun\n@Desc : d\n*/\n\npackage main\n\nimport (\n\t\""
},
{
"path": "2020/2-24-Go-Module/demo/a2.go",
"chars": 30,
"preview": "package main\n\nvar abc2 = 2343\n"
},
{
"path": "2020/2-24-Go-Module/demo/dir1/b.go",
"chars": 126,
"preview": "package dir1\n\n// Bbb1 不是同一文件夹同一package引用它,要大写\nvar Bbb1 = \"b.go bbb1\"\n\n//int_fjdk 同一文件夹同一package引用它,可以小写\nvar int_fjdk = 2"
},
{
"path": "2020/2-24-Go-Module/demo/dir1/b2.go",
"chars": 209,
"preview": "package dir1\n\nimport (\n\t\"a/dir2d\"\n\t// \"a/fdjk\"\n\t\"fmt\"\n)\n\n//T1 备注,函数名第一个字母\nfunc T1() {\n\tfmt.Println(\"b2.go使用b.go:\", int_f"
},
{
"path": "2020/2-24-Go-Module/demo/dir1/dir11/b11.go",
"chars": 69,
"preview": "package dir11\n\n// B11 不是同一文件夹同一package引用它,要大写\nvar B11 = \"b11.go B11\"\n"
},
{
"path": "2020/2-24-Go-Module/demo/dir2d/d2.go",
"chars": 39,
"preview": "package dir2d\n\nvar Ddd2 = \"d2.go ddd2\"\n"
},
{
"path": "2020/2-24-Go-Module/demo/dir2d/d21.go",
"chars": 95,
"preview": "package dir2d // fdjk\n//found packages dir2d (d2.go) and fdjk (d21.go) 在同一文件夹\n\nvar fj5dk = 324\n"
},
{
"path": "2020/2-24-Go-Module/demo/go.mod",
"chars": 18,
"preview": "module a\n\ngo 1.13\n"
},
{
"path": "2020/2-26-Go_Proxy_server/README.md",
"chars": 793,
"preview": "## 2-26-最简单的翻墙代理\n\n- 视频 \n - 失效了。 [越狱?最简单的代理服务器Go,翻过防火墙](https://www.bilibili.com/video/av91817713/)\n - 百度网盘\n "
},
{
"path": "2020/2-26-Go_Proxy_server/go.mod",
"chars": 29,
"preview": "module proxy_server\n\ngo 1.13\n"
},
{
"path": "2020/2-26-Go_Proxy_server/proxy_server.go",
"chars": 1834,
"preview": "/*\n@File : proxy_server1.go\n@Time : 2020/02/24 20:55:11\n@Author : play4fun\n@Desc : d\n\n一个简单的Golang实现的HT"
},
{
"path": "2020/2-26-多点签到领积分/README.md",
"chars": 338,
"preview": "# 多点App签到领积分\n\n- 视频 [写Python自动【多点App签到领积分】,100积分兑换1元钱](https://www.bilibili.com/video/av91889395/)\n\n- 积分有什么用\n - 下单的时候,"
},
{
"path": "2020/2-26-多点签到领积分/demo1.py",
"chars": 3027,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : demo1.py\n@Time : 2020/02/26 15:57:31\n@Desc : \n'''\nimport requests\n\n"
},
{
"path": "2020/2-26-多点签到领积分/多点-签到-抓包.txt",
"chars": 2022,
"preview": "多点\n签到\n\ncurl -H 'Host: appapis.dmall.com' -H 'Accept: */*' -H 'Cookie: first_session_time=1574310210261; web_session_coun"
},
{
"path": "2020/2-26-多点签到领积分/多点-领取奖励-抓包.txt",
"chars": 7052,
"preview": "领取奖励\n\ncurl -H 'Host: appapis.dmall.com' -H 'Accept: */*' -H 'Cookie: first_session_time=1574310210261; web_session_count"
},
{
"path": "2020/2-29-Docker-WeChat/README.md",
"chars": 1094,
"preview": "\n\n## 在Docker 运行 微信Windows版\n\n- 视频 [微信营销?在Docker运行微信Windows版,机器人自动回复淘口令](https://www.bilibili.com/video/av92594352)\n\n- 参考"
},
{
"path": "2020/2-3-Chrome-extensions/README.md",
"chars": 71,
"preview": "- 视频: [谷歌浏览器插件开发-文章关键词高亮显示](https://www.bilibili.com/video/av86550145/)"
},
{
"path": "2020/2-3-Chrome-extensions/content_scripts和background的消息传递.md",
"chars": 691,
"preview": "- 视频: \n\n\nhttps://blog.csdn.net/qq_35430000/article/details/79421544\n\n4.3. background\n后台(姑且这么翻译吧),是一个常驻的页面,它的生命周期是插件中所有类型"
},
{
"path": "2020/2-3-Chrome-extensions/参考.md",
"chars": 1289,
"preview": "- 参考文章\n - 简单-[谷歌浏览器插件开发](https://blog.csdn.net/u012865381/article/details/78645215)\n - 齐全详细 [Chrome插件(扩展)开发全攻略(干货)"
},
{
"path": "2020/2-4-App-Store/怎样做一个像 【七麦数据】那样的网站.txt",
"chars": 653,
"preview": "怎样做一个像 【七麦数据】那样的网站?\nhttps://www.qimai.cn/\n\n- 视频: [怎样抓取AppStore数据?做一个【七麦数据】网站,赚广告费](https://www.bilibili.com/video/av8665"
},
{
"path": "2020/2-4-App-Store/苹果 接口 node-js.txt",
"chars": 926,
"preview": "苹果 接口 node.js \n苹果App store 抓取API\nhttps://github.com/facundoolano/app-store-scraper \n安装\nnpm install -g app-store-scraper\n"
},
{
"path": "2020/2-5-Go语言入门/README.md",
"chars": 610,
"preview": "## Go语言快速入门上手-资料参考\n\n- 视频: [最快的Go语言入门指南!!资料参考](https://www.bilibili.com/video/av86957359/)\n\n- 安装参考 https://www.jianshu.co"
},
{
"path": "2020/2-5-TTS-Moviepy/README.md",
"chars": 83,
"preview": "\n- 视频: [营销号利器?讯飞语音合成TTS+Moivepy=自动合成视频](https://www.bilibili.com/video/av86838467/)"
},
{
"path": "2020/2-5-TTS-Moviepy/TTS/Install.txt",
"chars": 57,
"preview": "\n安装\npip3 install websocket\npip3 install websocket_client\n"
},
{
"path": "2020/2-5-TTS-Moviepy/TTS/config.py",
"chars": 140,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020-01-18 20:29\n# @File : config.py\n\n\n\"\"\"\nconfig.py:\n\"\"\"\n\nAPPID = 'x'\nAPIKey = "
},
{
"path": "2020/2-5-TTS-Moviepy/TTS/xf_service.py",
"chars": 5904,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020-01-18 20:25\n# @File : xf_service.py\n\n\n\"\"\"\nxf_service.py:\n\"\"\"\n\n# import webs"
},
{
"path": "2020/2-5-TTS-Moviepy/TTS/语音合成自动视频.ipynb",
"chars": 8742,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## 讯飞语音合成TTS+Moivepy=自动合成视频\"\n ]\n "
},
{
"path": "2020/2-6-BT_Torrent/README.md",
"chars": 704,
"preview": "# BT下载Torrent \n\n- 视频: [程序员怎样BT下载?宅男不难](https://www.bilibili.com/video/av87059432/)\n\n- 3种编程方式\n - Python\n - Node.js\n"
},
{
"path": "2020/2-6-Spider-Speed-test/README.md",
"chars": 255,
"preview": "# 爬虫速度比较\n\n- 视频:[Python和Go爬虫速度比较,Go简直太快了!Python很难追上!](https://www.bilibili.com/video/av87182685/)\n\n常用框架\n- Python\n - Sc"
},
{
"path": "2020/2-6-Spider-Speed-test/go_spider.go",
"chars": 734,
"preview": "/*\n@Time : 2020/2/6 15:17\n@File : go_spider.go\n\n*/\n\npackage main\nimport (\n\t\"github.com/gocolly/colly\"\n\t\"log\"\n\t\"fmt"
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/README.md",
"chars": 377,
"preview": "运行\n\n```shell script\n(.py3) localhost:2-6-Spider-Speed-test play$ cd scrapy_demo/\n(.py3) localhost:scrapy_demo play$ ls\n."
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy.cfg",
"chars": 265,
"preview": "# Automatically created by: scrapy startproject\n#\n# For more information about the [deploy] section see:\n# https://scrap"
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/items.py",
"chars": 289,
"preview": "# -*- coding: utf-8 -*-\n\n# Define here the models for your scraped items\n#\n# See documentation in:\n# https://docs.scrapy"
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/middlewares.py",
"chars": 3603,
"preview": "# -*- coding: utf-8 -*-\n\n# Define here the models for your spider middleware\n#\n# See documentation in:\n# https://docs.sc"
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/middlewares_proxy_redis.py",
"chars": 2616,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/2/18 20:10\n# @File : middlewares_proxy_redis.py\n\n\n\"\"\"\nmiddlewares_proxy_red"
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/pipelines.py",
"chars": 292,
"preview": "# -*- coding: utf-8 -*-\n\n# Define your item pipelines here\n#\n# Don't forget to add your pipeline to the ITEM_PIPELINES s"
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/settings.py",
"chars": 3214,
"preview": "# -*- coding: utf-8 -*-\n\n# Scrapy settings for scrapy_demo project\n#\n# For simplicity, this file contains only settings "
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/spiders/__init__.py",
"chars": 161,
"preview": "# This package will contain the spiders of your Scrapy project\n#\n# Please refer to the documentation for information on "
},
{
"path": "2020/2-6-Spider-Speed-test/scrapy_demo/scrapy_demo/spiders/example.py",
"chars": 884,
"preview": "# -*- coding: utf-8 -*-\n\n'''\nscrapy crawl example -s CLOSESPIDER_ITEMCOUNT=10000\n\n统计结果\n2020-02-06 20:48:55 [scrapy.exten"
},
{
"path": "2020/2-6-Spider-Speed-test/server.go",
"chars": 741,
"preview": "/*\n\n对比 Python 和 Go 语言的每秒请求数\nhttps://www.oschina.net/translate/python-vs-go-requests-per-second\n\n\ncurl http://127.0.0.1:8"
},
{
"path": "2020/2-6-gocolly/README.md",
"chars": 688,
"preview": "## gocolly 爬虫 入门和案例\n\n- 视频:[想要九阴真经(经验总结)吗?gocolly爬虫-入门和案例](https://www.bilibili.com/video/av86986554/)\n\n- 参考\n - https:"
},
{
"path": "2020/2-7-Docker-Nginx-antiClawer/README.md",
"chars": 1098,
"preview": "# Nginx反爬虫\n- 视频 [Nginx反爬虫-禁止UserAgent和IP,使用Docker和Go测试](https://www.bilibili.com/video/av87302823/)\n\n- 参考 \n - https:"
},
{
"path": "2020/2-7-Docker-Nginx-antiClawer/deny_userAgent.conf",
"chars": 706,
"preview": "#https://blog.csdn.net/markchiu/article/details/52512106\n\n#禁止Scrapy等工具的抓取\nif ($http_user_agent ~* (Scrapy|Curl|HttpClien"
},
{
"path": "2020/2-7-Docker-Nginx-antiClawer/go_spider.go",
"chars": 734,
"preview": "/*\n@Time : 2020/2/6 15:17\n@File : go_spider.go\n\n*/\n\npackage main\nimport (\n\t\"github.com/gocolly/colly\"\n\t\"log\"\n\t\"fmt"
},
{
"path": "2020/2-7-Docker-Nginx-antiClawer/nginx1.conf",
"chars": 773,
"preview": "user nginx;\nworker_processes 1;\n\nerror_log /var/log/nginx/error.log warn;\npid /var/run/nginx.pid;\n\n\nevents {\n "
},
{
"path": "2020/2-7-Docker-Nginx-antiClawer/server.go",
"chars": 857,
"preview": "/*\n\n对比 Python 和 Go 语言的每秒请求数\nhttps://www.oschina.net/translate/python-vs-go-requests-per-second\n\n\ngo run server.go\n\ncurl "
},
{
"path": "2020/2-9-Chrome插件-全文检索/README.md",
"chars": 422,
"preview": "# Chrome插件-全文检索\n\n- 视频 [Chrome插件-全文检索,加强Chrome的搜索功能](https://www.bilibili.com/video/av87717829/)\n\n- 日常问题\n - Chrome搜索功能"
},
{
"path": "2020/3-1-世界语言-翻译-Siri朗读/README.md",
"chars": 10413,
"preview": "# 3-1-世界语言-翻译-Siri朗读\n\n\n- 视频 [鬼畜!把中文翻译到世界语言,然后用Siri朗读](https://www.bilibili.com/video/av92915931/)\n\n- 百度翻译api\n - [通用翻"
},
{
"path": "2020/3-1-世界语言-翻译-Siri朗读/baidu_translate_api.py",
"chars": 2041,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2017/12/4 13:37\n# @Author : play4fun\n# @File : translate_api.py\n# @Software: Py"
},
{
"path": "2020/3-1-世界语言-翻译-Siri朗读/config.py",
"chars": 136,
"preview": "# -*- coding: utf-8 -*-\n\n# @File : config.py\n# @Software: PyCharm\n\n\"\"\"\nconfig.py:\n\"\"\"\n\n\n\nbaidu_appid = 'xxx'\nbaidu_se"
},
{
"path": "2020/3-1-世界语言-翻译-Siri朗读/macOS-siri-百度翻译-TTS.py",
"chars": 3378,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/1 14:58\n# @File : macOS-siri-百度翻译-TTS.py\n\n\n\"\"\"\nmacOS-siri-百度翻译-TTS.py:\n\n你"
},
{
"path": "2020/3-1-世界语言-翻译-Siri朗读/py-调用macos内置的语音听写功能.py",
"chars": 2175,
"preview": "# coding=utf-8\n#Python Text to Speech in Macintosh\n#https://stackoverflow.com/questions/12758591/python-text-to-speech-i"
},
{
"path": "2020/3-10-nonebot_Coolq_Docker/README.md",
"chars": 2165,
"preview": "# nonebot+酷Q+Docker\n\n- 视频 \n - [Python编程实现【QQ 聊天机器人】nonebot+酷Q+Docker](https://www.bilibili.com/video/av95262479/)\n "
},
{
"path": "2020/3-13-macOS-lock-screen/README.md",
"chars": 1012,
"preview": "# macOS 倒计时 自动锁屏\n\n- 参考\n - Ubuntu [A timer that automatically locks the screen to take a break away from the computer?"
},
{
"path": "2020/3-13-macOS-lock-screen/lockscreen.py",
"chars": 665,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : lockscreen.py\n@Time : 2020/03/13 10:15:23\n@Author : play4fun\n@Desc "
},
{
"path": "2020/3-13-macOS-lock-screen/suspend.py",
"chars": 689,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : suspend.py\n@Time : 2020/03/13 09:36:08\n@Author : play4fun\n@Desc : "
},
{
"path": "2020/3-14-DNS查询/README.md",
"chars": 855,
"preview": "\n# DNS查询 nameserver\n- 视频 [DNS查询nameserver,用WireShark检查DNS报文,Python编程](https://www.bilibili.com/video/av96180822/)\n- 参考 \n"
},
{
"path": "2020/3-14-时间管理/README.md",
"chars": 1021,
"preview": "# 时间管理\n- 视频 [时间管理!番茄工作法,Python编程倒计时,macOS自动锁屏](https://www.bilibili.com/video/av96158601/)\n\n- [番茄工作法](https://baike.baid"
},
{
"path": "2020/3-16-GitHub-Free/README.md",
"chars": 749,
"preview": "# Github 免费资源\n- https://github.com/search\n\n- 视频 [大宝藏!Github免费资源!免费电子书](https://www.bilibili.com/video/av96702294/)\n\n- 搜索"
},
{
"path": "2020/3-16-GitHub-Free/proxy_list1.py",
"chars": 1412,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : proxy_list1.py\n@Time : 2020/03/16 10:32:51\n@Author : play4fun\n@Desc "
},
{
"path": "2020/3-16-GitHub-Free/verify_proxy.py",
"chars": 1249,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : verify_proxy.py\n@Time : 2020/03/15 09:49:45\n@Author : play4fun\n@Desc "
},
{
"path": "2020/3-16-企业微信/QYWX_APP/WXBizMsgCrypt.py",
"chars": 12441,
"preview": "#!/usr/bin/env python\n#-*- encoding:utf-8 -*-\n\n\"\"\" 对企业微信发送给企业后台的消息加解密示例代码.\n@copyright: Copyright (c) 1998-2014 Tencent I"
},
{
"path": "2020/3-16-企业微信/QYWX_APP/callback1.py",
"chars": 8231,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/16 15:41\n# @File : callback1.py\n\n\n\"\"\"\ncallback1.py:\n\"\"\"\nimport time\nfrom "
},
{
"path": "2020/3-16-企业微信/QYWX_APP/config.py",
"chars": 285,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/16 15:49\n# @File : config.py\n\n\n\"\"\"\nconfig.py:\n\"\"\"\n\n# 企业微信>应用管理>新建\nCorpID "
},
{
"path": "2020/3-16-企业微信/QYWX_APP/ierror.py",
"chars": 782,
"preview": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#########################################################################\n"
},
{
"path": "2020/3-16-企业微信/QYWX_APP/安装.md",
"chars": 29,
"preview": "\n\npip3 install pycryptodome\n\n"
},
{
"path": "2020/3-16-企业微信/README.md",
"chars": 791,
"preview": "# 企业微信 Python编程\n\n- 视频 [企业微信【群机器人】轻松上手,企业应用App接收和回复用户消息,Python编程](https://www.bilibili.com/video/av96809101/)\n\n\n- 群机器人\n "
},
{
"path": "2020/3-16-企业微信/bot1.py",
"chars": 541,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : bot1.py\n@Time : 2020/03/15 11:21:27\n@Author : play4fun\n@Desc : h"
},
{
"path": "2020/3-17-Auto.js/Programer-Pay-Solution.md",
"chars": 542,
"preview": "\n# 个人开发者-支付方案\n\n- 视频 [Auto.js+ mitmproxy个人开发者-支付方案,没有营业执照也可以向客户收款,自动监听【收款小账本】小程序](https://www.bilibili.com/video/av972883"
},
{
"path": "2020/3-17-Auto.js/README.md",
"chars": 1331,
"preview": "# Auto.js 不需要Root权限的JavaScript自动化软件\n- https://github.com/hyb1996/Auto.js\n- 文档 https://hyb1996.github.io/AutoJs-Docs/#/\n\n"
},
{
"path": "2020/3-17-Auto.js/微信/微信-收款码-输入金额-备注.js",
"chars": 695,
"preview": "auto();\n//微信Android版本:7.0.10\n//验证成功\n\n//日志输出\nfunction tLog(msg) {\n toast(msg);\n console.log(msg)\n}\n\n//进入【收款码】页面\n\nto"
},
{
"path": "2020/3-17-Auto.js/微信/微信-收款码-输入金额-捕捉toast.js",
"chars": 1877,
"preview": "auto();\n//微信Android版本:7.0.10\n//验证成功\n\n//监听toast日志\n//11:58:40.480/D: \n// Toast内容: 图片已保存至/storage/emulated/999/tencent/Micr"
},
{
"path": "2020/3-17-Auto.js/微信/微信-收款码-输入金额.js",
"chars": 335,
"preview": "//微信Android版本:7.0.10\n//验证成功\n\n//进入【收款码】页面\n\ntoast(\"输入金额\");\n//点击成功\nsetScreenMetrics(1080, 2340);//屏幕截图,便能看到分辨率\nclick(322,11"
},
{
"path": "2020/3-17-Auto.js/微信/微信1.js",
"chars": 48,
"preview": "toast(\"启动App\");\n//启动微信\nlaunch(\"com.tencent.mm\");"
},
{
"path": "2020/3-17-Auto.js/微信/收款码.js",
"chars": 461,
"preview": "//进入【收款码】页面\ntoast(\"付款\");\n\n//设置金额\n// id(\"list\").findOne().children().forEach(child => {\n// var target = child.findOne"
},
{
"path": "2020/3-17-Auto.js/打开QQ聊天.js",
"chars": 420,
"preview": "//https://hyb1996.github.io/AutoJs-Docs/#/app\n\n//先运行Auto.js \nvar qq = \"2262965903\";\napp.startActivity({ \n action: \"an"
},
{
"path": "2020/3-18-Docker-PHP-dataoke/PHP/README.md",
"chars": 788,
"preview": "- 本地测试 \n\n## 修改hosts \n```\nvi /etc/hosts\n127.0.0.1 youhui.dark.net.cn\n```\n\n- 参考 php:fmp\n - https://www.runoob.com/docke"
},
{
"path": "2020/3-18-Docker-PHP-dataoke/PHP/nginx/conf/conf.d/php.conf",
"chars": 489,
"preview": "server {\n listen 80;\n server_name localhost;\n\n location / {\n root /usr/share/nginx/html;\n "
},
{
"path": "2020/3-18-Docker-PHP-dataoke/PHP/nginx/www/index.html",
"chars": 297,
"preview": "<html>\n <head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n <title>hello 测试一下<"
},
{
"path": "2020/3-18-Docker-PHP-dataoke/PHP/nginx/www/index.php",
"chars": 29319,
"preview": "<?php\n/*\n * 请勿使用windows下的记事本修改本文件。推荐使用 notepad++\n * * 版本v2.8\n * 1.缓存支持https\n *\n * * 版本v2.7\n * 1.优化自动选择最优服务api和增加api数"
},
{
"path": "2020/3-18-Docker-PHP-dataoke/PHP/nginx/www/phpinfo.php",
"chars": 20,
"preview": "<?php\n phpinfo();\n?>"
},
{
"path": "2020/3-18-Docker-PHP-dataoke/README.md",
"chars": 362,
"preview": "# Docker+PHP 部署【大淘客cms网站】\n\n- 视频 [Docker+PHP 部署【大淘客cms网站】,技术门槛很低,大家都可以做](https://www.bilibili.com/video/av97236044/)\n\n- 操"
},
{
"path": "2020/3-18-raspberry-pi-VScode/README.md",
"chars": 1439,
"preview": "# 在 树莓派 上安装VScode,穷人也能学编程\n\n- 视频 [在【树莓派】上安装VScode,穷人也能学编程。穷孩子再也不用担心上不了网课,跟不上富孩子的脚步了](https://www.bilibili.com/video/av976"
},
{
"path": "2020/3-18-raspberry-pi-VScode/request-ip.py",
"chars": 387,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : request-ip.py\n@Time : 2020/03/19 18:07:01\n@Author : play4fun\n@Desc "
},
{
"path": "2020/3-2-Wikipedia/README.md",
"chars": 745,
"preview": "\n- Wikipedia维基百科\n\n- 不用先爬虫抓取\n - 每个月都有打包,免费下载\n\n- 数据库下载\n - 要挂VPN\n - https://zh.wikipedia.org/wiki/Wikipedia:%E6%95"
},
{
"path": "2020/3-20-keyboard-man/README.md",
"chars": 1267,
"preview": "\n# 键盘侠 提高工作效率\n\n- 视频 [怎样做一个键盘侠?快来使用【快捷键】,提高工作效率](https://www.bilibili.com/video/av97804671)\n\n- 参考\n - [Mac系统切换机械键盘win和a"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/README.md",
"chars": 344,
"preview": "\n# 豆瓣电影 Chrome 插件\n\n- 视频 [做个【豆瓣电影Chrome插件】,再也不用满世界找资源BT下载了](https://www.bilibili.com/video/BV1D7411m7pF/)\n- 源代码 放在extens"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/extension/_locales/en/messages.json",
"chars": 185,
"preview": "{\n \"description\": {\n \"message\": \"Show Magnet Link at Douban Movie detail page,so we can download directly\"\n },\n"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/extension/_locales/zh_CN/messages.json",
"chars": 133,
"preview": "{\n \"description\": {\n \"message\": \"在豆瓣电影详情页,展示BT种子磁链接,所以我们可以直接下载,观看 ^_^\"\n },\n \"title\": {\n \"message\": \"豆瓣电影"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/extension/css/tab.css",
"chars": 685,
"preview": "\n #main {\n width: 600px;\n margin: 200px auto;\n }\n\n #tab {\n overflow: hidden;\n backg"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/extension/js/background.js",
"chars": 15240,
"preview": "//background.js\n\nconsole.log(\"background.js init\");\n\n\n\n\n//接收前台的消息\nchrome.runtime.onMessage.addListener(\n function (re"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/extension/js/content.js",
"chars": 2014,
"preview": "//content.js\n\nconsole.log(\"content.js init\");\n//先添加 table\nlet table = '<div id=\"app\">' +\n ' <div v-if=\"looking\" id"
},
{
"path": "2020/3-23-douban-movie-chrome-extension/extension/manifest.json",
"chars": 1150,
"preview": "{\n \"version\": \"0.1.1\",\n \"manifest_version\": 2,\n \"permissions\": [\n \"<all_urls>\",\n \"contextMenus\",\n"
},
{
"path": "2020/3-24-macOS-Python-Notification/README.md",
"chars": 619,
"preview": "\n# macOS 桌面通知\n- 需求\n - 有时候需要发送消息通知自己\n - 手机-微信-查看消息不方便,影响工作\n - 在电脑上工作,可以使用【桌面通知】,Windows也有\n\n- 视频 [macOS桌面通知,Pytho"
},
{
"path": "2020/3-24-macOS-Python-Notification/bili_status_number.py",
"chars": 1244,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : bili-status-number.py\n@Time : 2020/03/05 21:55:27\n@Desc : 获取我的账号状态,"
},
{
"path": "2020/3-24-macOS-Python-Notification/macos_notify.py",
"chars": 662,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/24 15:45\n# @File : macos_notify.py\n\n\n\"\"\"\nmacos_notify.py:\n参考\nhttps://stac"
},
{
"path": "2020/3-25-git-sourcetree-Fork/README.md",
"chars": 383,
"preview": "\n# 代码版本控制软件\n\n- 视频 [你喜欢使用哪个【代码版本控制软件】?sourcetree还是Fork?](https://www.bilibili.com/video/BV1Jz411b7RY/)\n\n- git\n - git a"
},
{
"path": "2020/3-26-m3u8-decrypt/README.md",
"chars": 1582,
"preview": "\n\n# 解密 m3u8\n\n- 视频 [冷门知识!解密m3u8视频,下载ts文件后用FFmpeg合并](https://www.bilibili.com/video/BV17c411h7z7/)\n - 上次视频 [怎样用Python下载"
},
{
"path": "2020/3-28-Python反向编程/README.md",
"chars": 250,
"preview": "\n# Python反向编程? 编程经验\n\n- 视频 [Python反向编程?根据 Pycharm错误提示 来完善代码](https://www.bilibili.com/video/BV1gC4y1s7GR/)\n\n```\n先写结果,反过来\n"
},
{
"path": "2020/3-28-Python反向编程/demo.py",
"chars": 763,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/28 13:33\n# @File : demo.py\n\n\n\"\"\"\ndemo.py:\n\"\"\"\nimport requests\n\n\ndef main("
},
{
"path": "2020/3-29-Chrome-History/README.md",
"chars": 1144,
"preview": "\n- Chrome插件获取 历史记录\n - 只能在background.js执行\n\n- 参考 http://open.chrome.360.cn/html/dev_history.html\n\n- 搜索\n - [How to ge"
},
{
"path": "2020/3-30-程序员-邮件订阅/README.md",
"chars": 883,
"preview": "\n# 邮件订阅 newsletter Subscribe\n- 视频 [程序员-邮件订阅,自动接收各种最新资讯,技术趋势,比别人懂多一点](https://www.bilibili.com/video/BV1k64y1M7es/)\n- 目的\n"
},
{
"path": "2020/3-31-python-smart-device/README.md",
"chars": 1608,
"preview": "\n# python编程 控制智能硬件\n- 视频 [python编程-控制智能硬件,4个插座可以实现很多功能,智能家居终于实现了](https://www.bilibili.com/video/BV1up4y1C7mv/)\n\n- 智能硬件\n "
},
{
"path": "2020/3-31-python-smart-device/broadlink1.py",
"chars": 1901,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/31 10:53\n# @File : broadlink1.py\n\n\n\"\"\"\nbroadlink1.py:\nhttps://www.domotic"
},
{
"path": "2020/3-31-python-smart-device/广播1.py",
"chars": 2669,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/30 22:24\n# @File : 广播1.py\n\n\n\"\"\"\n广播1.py:\n\nhttps://stackoverflow.com/questi"
},
{
"path": "2020/3-31-python-smart-device/监听1.py",
"chars": 680,
"preview": "# -*- coding: utf-8 -*-\n# @Time : 2020/3/31 10:09\n# @File : 监听1.py\n\n\n\"\"\"\n监听1.py:\n\n找不出来 智能插排的传送方式\n\n插排在路由器显示为\nBroadL"
},
{
"path": "2020/3-4-WireShark-https-Decrypt/README.md",
"chars": 3852,
"preview": "\n- WireShark 抓包 解密 https\n - 演示,淘宝直播,博物馆云春游,抓取视频回放网址\n\n- 视频 [云春游?WireShark抓包,解密https,跟踪互联网7层协议](https://www.bilibili.c"
},
{
"path": "2020/3-5-Python-Request-https-with-proxy/README.md",
"chars": 690,
"preview": "# https请求安全性,验证证书\n\n\n- 启动 mitmproxy\n - 测试 \n - curl -k -x 127.0.0.1:8080 https://httpbin.org/ip\n - -k 表示 "
},
{
"path": "2020/3-5-Python-Request-https-with-proxy/verify_https.go",
"chars": 906,
"preview": "/*\n@File : verify_https.go\n@Time : 2020/03/07 09:38:20\n@Author : play4fun\n@Desc : 同样的逻辑,用Go语言实现\n*/\n\npa"
},
{
"path": "2020/3-5-Python-Request-https-with-proxy/verify_https.py",
"chars": 721,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : verify_https.py\n@Time : 2020/03/05 16:23:06\n@Author : play4fun\n@Desc "
},
{
"path": "2020/3-5-Ubuntu-install-Wine-run-Windows/README.md",
"chars": 999,
"preview": "# Ubuntu安装Wine-执行Windows程序\n\n- 参考\n - https://www.winehq.org/\n - 安装指南Ubuntu https://wiki.winehq.org/Ubuntu_zhcn\n "
},
{
"path": "2020/3-6-macOS创建输入法/README.md",
"chars": 2412,
"preview": "# 很简单!macOS创建自己的输入法\n\n- 视频 [很简单!macOS创建自己的输入法](https://www.bilibili.com/video/av94162883/)\n\n- 参考\n - [在 Mac 上创建和使用您自己的输"
},
{
"path": "2020/3-7-web-proxy/README.md",
"chars": 646,
"preview": "# Python编程获取【在线网页代理】地址\n\n- 视频 [先收藏!!Python编程获取【在线网页代理】的重定向地址](https://www.bilibili.com/video/av94486958/)\n\n- 在线ping服务 htt"
},
{
"path": "2020/3-7-web-proxy/demo1.py",
"chars": 1857,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : demo1.py\n@Time : 2020/03/07 19:34:52\n@Author : play4fun\n@Desc : "
},
{
"path": "2020/3-7-web-proxy/demo2.py",
"chars": 1430,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : demo2.py\n@Time : 2020/03/07 20:32:21\n@Author : play4fun\n@Desc : "
},
{
"path": "2020/3-9-DNS-server/README.md",
"chars": 1562,
"preview": "## 编程实现DNS服务器 - 用来翻墙?\n\n- 视频 [编程实现DNS服务器,Python+Go。代码很简单!](https://www.bilibili.com/video/av94972898/)\n - 上个视频 [先收藏!"
},
{
"path": "2020/3-9-DNS-server/dns_flask.py",
"chars": 780,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : dns_flask.py\n@Time : 2020/03/09 16:36:03\n@Author : play4fun\n@Desc "
},
{
"path": "2020/3-9-DNS-server/mini_dns_server.go",
"chars": 2220,
"preview": "/*\n@File : mini_dns_server.go\n@Time : 2020/03/08 20:17:26\n@Author : play4fun\n@Desc : https://jameshfis"
},
{
"path": "2020/4-1-mitmproxy-抖音/README.md",
"chars": 1812,
"preview": "\n# 抖音 抓包 并存到 数据库\n- 视频 [mitmproxy-抖音抓包,并把短视频链接存到MongoDB数据库](https://www.bilibili.com/video/BV1ae411x78w)\n\n- 搜索接口\n - ht"
},
{
"path": "2020/4-10-MCN-papi酱/README.md",
"chars": 1132,
"preview": "\n# 网红MCN papi酱\n\n- 视频 [什么是MCN?papi酱成立的papitube签约了多少网红?](https://www.bilibili.com/video/BV1MA411b7YX/)\n - 指南 [怎样建立一个MCN"
},
{
"path": "2020/4-10-MCN-papi酱/analysis.py",
"chars": 3433,
"preview": "# -*- encoding: utf-8 -*-\n'''\n@File : analysis.py\n@Time : 2020/04/10 09:11:05\n@Desc : \n'''\n\nimport reques"
},
{
"path": "2020/4-2-今日头条-原创视频-收益/README.md",
"chars": 623,
"preview": "\n# 今日头条 制作视频 收益\n- 看看别人是怎样的收益\n\n- 视频 [看看别人的今日头条-视频收益,心动了吗?鼓励大家走【原创视频】的制作路线](https://www.bilibili.com/video/BV1at4y1m7VX/)\n"
},
{
"path": "2020/4-23-moviepy-GIF/README.md",
"chars": 455,
"preview": "\n# 使用moviepy制作 GIF动画\n\n- 视频 [不需要视频剪辑软件,使用moviepy制作GIF动画,Python编程](https://www.bilibili.com/video/BV1hK4y1k7Qn/)\n\n- 步骤\n "
},
{
"path": "2020/4-23-moviepy-GIF/跳绳-GIF动画.ipynb",
"chars": 10400,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 跳绳,图片,制作GIF动画\"\n ]\n },\n {\n \""
},
{
"path": "2020/4-23-程小奔python/README.md",
"chars": 528,
"preview": "\n# 程小奔 智能小车 python编程\n- 官网 https://www.makeblock.com/cn/steam-kits/codey-rocky\n\n- 视频 [买了2年积灰了!程小奔 智能小车 python编程](https://"
},
{
"path": "2020/4-23-程小奔python/检测物体.py",
"chars": 1006,
"preview": "# generated by mBlock5 for codey & rocky\n# codes make you happy\nimport codey, event, time, rocky\n\n@event.start\ndef on_st"
},
{
"path": "2020/4-29-GoPro-MAX/README.md",
"chars": 4389,
"preview": "\n# GoPro MAX 全景运动相机 购买 使用 测评\n- 《穷人评测》第一集\n\n- 视频 [GoPro MAX 全景运动相机 购买 使用 测评,《穷人评测》第一集 ](https://www.bilibili.com/video/BV1"
},
{
"path": "2020/4-3-Jupiter-Notebook-插入HTML视频/README.md",
"chars": 298,
"preview": "\n## Jupiter-Notebook-插入HTML视频\n\n- 参考\n - [How can I play a local video in my IPython notebook?](https://stackoverflow.c"
},
{
"path": "2020/4-3-Jupiter-Notebook-插入HTML视频/html_video.ipynb",
"chars": 4441,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## 插入 HTML 视频\\n\",\n \"- 在命令行执行 jup"
},
{
"path": "2020/4-8-instagram/README.md",
"chars": 965,
"preview": "\n# Instagram 爬虫\n\n- 视频 [想看漂亮小姐姐吗?Instagram爬虫,Python编程](https://www.bilibili.com/video/BV1sg4y187rh)\n\n- 参考\n - GitHub\n "
},
{
"path": "2020/5-4-movie-调查犯罪是我们的职业/Crime est notre affaire.subs.cn.srt",
"chars": 63607,
"preview": "1个\n00:02:03,807 --> 00:02:07,807\n 总结一下:谨慎与天才\n 贝雷斯福德结婚了..\n\n2\n00:02:09,327 --> 00:02:11,886\n ..他们有一个女儿,..\n\n3\n00:02:11,887 "
}
]
// ... and 109 more files (download for full content)
About this extraction
This page contains the full source code of the makelove/Programer_Log GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 309 files (29.3 MB), approximately 884.1k tokens, and a symbol index with 273 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.