分類
软件

安卓手機把短信導出成 JSON 文本

本來打算用 Termux API 中的讀取短信功能,結果官方說谷歌不允許,所以後來找到了 hydrargyrum 開發的 Epistolaire。 Epistolaire 可以把本機的短信和彩信全部導出到 JSON 文本中,使用非常簡單。

本文最早發布於 2020/08/07。

分類
软件

[18+] Hendroid 同人與變態漫畫瀏覽器

發現一個令人墮落的應用( ͡° ͜ʖ ͡°) Hendroid:Doujinshi & Hentai-Manga archiving and viewing app.

分類
软件

安卓手機使用 dnscrypt proxy

目的:未 root 的安卓 8 手機在 WiFi 和 4G 下使用 dnscrypt-proxy 2 避免 DNS 污染。

跑起來

使用 Termux 來運行 dnscrypt-proxy 2,配置方法參考Fedora使用DNSCrypt。由於手機未 root ,所以無法監聽 53 端口,可以用 5353 替代。配置成功後 dig ft.wupo.info -p 5353 @127.0.0.1 應該可以能正確返回 DNS 查詢。

使用 DNSfilter去 F-droid 下載)實現的本地 VPN 來修改系統的DNS查詢,它同時還能攔截廣告。配置非常簡單,只需要在DNS配置欄選中禁用 DNS 服務器查找,並在輸入框中輸入下面一行即可。

127.0.0.1::5050::UDP

日常使用

新建文件 /data/data/com.termux/files/home/scripts/dns.sh 並給予執行權限。

startDns(){
  nohup /data/data/com.termux/files/home/opt/dnscrypt/dnscrypt-proxy -config /data/data/com.termux/files/home/opt/dnscrypt/dnscrypt-proxy.toml&
  echo "starting dns"
  sleep 10
  am start --user 0 -n  dnsfilter.android/.DNSProxyActivity
  sleep 2
}
stopDns(){
  am start --user 0 -n  dnsfilter.android/.DNSProxyActivity
  sleep 8
  pkill dnscrypt-proxy
  echo "killed dns"
}

status(){
  vt1="$(ps -ef | grep dnscrypt-proxy | wc -l)"
  vt2=" "
  if [[ $vt1 = "2" ]]; then
    dnsproxyStatus="1"
    vt2="$(dig -p 5353 +short www.v2ex.com @127.0.0.1)"
  else
    dnsproxyStatus="0"
  fi  
}
if [[ $1 = "1" ]]; then
  echo "start"          
  startDns
elif [[ $1 = "2" ]]; then
  echo "restart"  
  stopDns         
  sleep 3           
  startDns  
elif [[ $1 = "0" ]]; then
  echo "stop"
  stopDns
elif [[ $1 = "s" ]]; then
  status
  echo "dns: $dnsproxyStatus | $vt2"   
fi

在 ~/.bash_profile 中增加快捷命令

alias d1='/data/data/com.termux/files/home/scripts/dns.sh 1'
alias d0='/data/data/com.termux/files/home/scripts/dns.sh 0'
alias dt='/data/data/com.termux/files/home/scripts/dns.sh s'

使用的時候,運行 d1 即可啟動 dnscrypt-proxy 服務,並且拉起 DNSfilter。運行 d0 則會先拉起 DNSfilter,此時需要手動點下 Close 退出 APP,然後會關閉 dnscrypt-proxy 服務。

本文最早發布於 2020/06/18。

分類
软件

日常使用的二維碼小工具

在電腦上生成二維碼(QR Code),我使用的是火狐瀏覽器中 rugk 的開發的開源瀏覽器插件 Offline QR Code Generator ,顧名思義,就是無需網絡連接,在本地即可生成二維碼。

安卓手機上生成二維碼,我使用的是 muelli 開發的 Barcodegen。 Barcodegen 可以生成包括二維碼在內的多種格式條碼。後來我發現 Barcode Scanner 的上面的 "Share" 按鈕就可以生成二維碼。

Fedora 下的二維碼識別可以使用 zbar。

sudo dnf install zbar
zbarimg qrcode.jpg
#QR-Code:https://ft.wupo.info/%e6%97%a5%e5%b8%b8%e4%bd%bf%e7%94%a8%e7%9a%84%e4%ba%8c%e7%b6%ad%e7%a2%bc%e5%b0%8f%e5%b7%a5%e5%85%b7/
#scanned 1 barcode symbols from 1 images in 0.01 seconds

安卓手機上掃描二維碼,我使用的是 zxing 開發的 Barcode Scanner 。 這是個老牌條碼掃描器了,現在項目已經進入維護模式,也就不太可能會有更新了,但是用起來是一點問題都沒有的。

本文最早發布於 2020/03/23。

分類
Linux 软件

Linux上的離線字典——GoldenDict

GoldenDict是一款方便的字典應用,不僅支持離線字典和屏幕取詞,也支持在線辭典服務。Fedora直接從軟件倉庫安裝goldendict即可,默認的屏幕取詞快捷鍵是Ctrl+C+C。

分享幾個字典的下載地址:https://1drv.ms/f/s!AiSujQyFSc-uab_ItF61BBKnLUs。GoldenDict中的字典順序也是下面順序。

  1. Babylon_English_Chinese_S_.BGL
  2. Babylon_Chinese_S_English.BGL
  3. Oxford_Advanced_Learner_English-Chinese_Dictionary-4th.bgl
  4. ConciseOxfordEnglishDictionary.dsl.dz
  5. Oxford English Dictionary (2nd Edition) .bgl
  6. 现代汉英词典(金山).dsl.dz

安卓也有GoldenDict可用,我用的免費版(谷歌市場:GoldenDict Free),有最大5個字典的限制,但是也夠用了。

使用espeak來發音

#安裝espeak
sudo dnf install espeak
#打開GoldenDict,菜單欄依次選擇
#編輯/字典/字典來源/程式/新增
#新增內容為:
#類型:音訊
#名稱:espeak
#命令列:/usr/bin/espeak -v en -s 120 %GDWORD%
#圖示:/usr/share/doc/espeak/html/images/lips.png
#最後勾選啟用框,保存並重啟GoldenDict就可以有英文發音了

更多字典可以從這些地方獲得:http://download.huzheng.org/(來自:Good offline dictionaries for GoldenDict)

本文最早發布於 2018/11/27。

分類
Linux 软件

AFWall+ 安卓可用的iptables

安卓手機如果root了,便可以通過AFWall+Github項目地址)來使用iptables管控網絡。

在安卓上使用DNSCrypt

由於TCP旁路阻斷技術的應用,DNSCrypt已經不能為日常使用網絡帶來太多方便,所以僅僅是記錄一下使用方法而已。先安裝好AFWall+並根據自己的喜好定製軟件的聯網規則,然後啟用iptables。我們使用Termux來至執行iptabls命令。根據自己的手機系統下載dnscrypt-proxy,比如我的就是dnscrypt-proxy-android_arm64-2.0.17.zip。如果不知道自己的手機系統,可以運行uname -a,如果出現aarch64就跟我一樣下載android_arm64版本就行。下載後解壓到/data/data/com.termux/files/home/opt/dns目錄里。複製一份文件夾里的配置文件即cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml就可以了,配置也可以參考Fedora使用DNSCrypt。下面的文件我是放在家目錄下的,文件名是dns.sh,記得加上執行權限。

remove127(){
  /system/bin/iptables -t nat -D OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -D OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -D OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -D OUTPUT -d 114.114.114.114 -p udp --dport 53 -j DNAT --to-destination 114.114.114.114:53
}
add127(){
  /system/bin/iptables -t nat -I OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -I OUTPUT -d 114.114.114.114 -p udp --dport 53 -j DNAT --to-destination 114.114.114.114:53&&/system/bin/iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53&&/system/bin/iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
}
startDns(){
  /data/data/com.termux/files/home/opt/dns/dnscrypt-proxy -config /data/data/com.termux/files/home/opt/dns/dnscrypt-proxy.toml > /dev/null 2>1 &
  echo "starting dns"
  sleep 15
}
stopDns(){
  pkill dnscrypt-proxy
  echo "killed dns"
}
test(){
  var1=$(su -c "/system/bin/iptables -C OUTPUT -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1:53")
}
status(){
  vt1="$(ps -ef | grep dnscrypt-proxy | wc -l)"
  if [[ $vt1 = "2" ]]; then
    dnsproxyStatus="1"
  else
    dnsproxyStatus="0"
  fi
  vt2="$(/system/bin/iptables -t nat -L | grep 127.0.0.1:53 | wc -l)"
  if [[ $vt2 = "2" ]]; then
    iptablesStatus="1"
  else
    iptablesStatus="0"
  fi
}
if [[ $1 = "1" ]]; then
  echo "start"      
  remove127              
  sleep 5                
  startDns       
  add127
elif [[ $1 = "2" ]]; then
  echo "restart"        
  remove127
  stopDns         
  sleep 3           
  startDns               
  add127 
elif [[ $1 = "0" ]]; then
  echo "stop"
  remove127
  stopDns
elif [[ $1 = "s" ]]; then
  status
  echo "dns: $dnsproxyStatus | iptables: $iptablesStatus"
else
  status
  if [[ $dnsproxyStatus = "1" ]]; then
    echo "$(date) dns ok" >> /data/data/com.termux/files/home/log.log
  else
    remove127
    stopDns
    remove127
    sleep 5
    startDns
    add127
    echo "$(date) dns started" >> /data/data/com.termux/files/home/log.log
  fi
  
fi
#使用說明
#首先切換的超級用戶
su
#查看當前狀態,1代表開啟,0代表關閉
./dns.sh s
#關閉dnscrypt-proxy
./dns.sh 0
#開啟dnscrypt-proxy
./dns.sh 1
#重新啟動dnscrypt-proxy
./dns.sh 2

啟動完成後可以通過dnsleaktest.com來查看當前的本機的dns。本來腳本還做了自啟動的適配,但是無論是Termux的自動啟動還是Magisk的自動啟動,都不太好用就算了。

本文最早發布於 2018/10/29。

分類
方法

Android套用日文字體

據說有的手機(三星,LG,HTC)可以直接選擇系統字體,真好,但是索尼不行(更正:港版不行,日版可以)。我只是修改了系統的字體配置文件,讓顯示簡體中文時,首先套用日語SomcUDGothic-Regular.ttf字體,如果沒有再用回原來的NotoSansCJK-Regular.ttc字體。這樣不會出現口口口,但時畢竟字體差異在那裡,如果追求完美顯示的話,這個方法是不合適的。

#備份原始文件
cp /system/etc/fonts.xml /system/etc/fonts.xml.bak
vi /system/etc/fonts.xml
#添加如下三行到<family lang="zh-Hans">前。
    <family lang="zh-Hans">
        <font weight="400" style="normal">SomcUDGothic-Regular.ttf</font>
    </family>
#重啟手機即可

本文最早發布於 2018/09/20。