2017年5月9日星期二

安装 ShadowsocksR 服务器端 (Python多用户版)

ShadowsocksR 使用 Socks5 代理方式,分为服务器端和客户端。在使用之前,需要先将服务器端部署到服务器上面,然后通过客户端连接并建立本地代理。本文详细介绍如何在服务器端安装ShadowsocksR (Python多用户版)
ssr

前期准备

  • 国外(或香港地区)VPS 一台
  • 已顺利通过 SSH 连接到服务器

服务器端安装

获取源代码

Debian / Ubuntu:
apt-get install git
git clone https://github.com/shadowsocksr-rm/shadowsocksr.git
CentOS:
yum install git
git clone https://github.com/shadowsocksr-rm/shadowsocksr.git

服务端配置

ssr

进入上一步下载的 shadowsocksr 文件夹进行初始化配置 (这里假设 shadowsocksr 文件夹是在服务器的根目录下,如果不是,自己适当调整命令):
cd ~/shadowsocksr
bash initcfg.sh
接下来输入命令 ls 会看到 ~/shadowsocksr 文件夹下有一个名为 user-config.json 用户配置文件。用 nano 命令打开该文件,修改好之后按 Ctrl+O >> 回车 >> Ctrl+X 保存退出
nano user-config.json

user-config.json 多端口配置

  • 删去 "server_port": 8388, (含逗号)
  • 删去 "password": "m", 替换为如下多端口代码:
"port_password": {
    "8001":"password1",
    "8002":"password2",
    "8003":"password2"
},
如果要为每个端口配置不同的混淆协议,可以这样写:
"port_password": {
    "8001":{"protocol":"auth_aes128_md5", "password":"password1", "obfs":"tls1.2_ticket_auth", "obfs_param":"cloudflare.com"},
    "8002":{"protocol":"auth_sha1_v2", "password":"password2", "obfs":"tls1.2_ticket_auth"},
    "8003":{"protocol":"auth_simple", "password":"password3"}
},

使用配置好的文件运行

cd ~/shadowsocksr/shadowsocks
./logrun.sh

可能出现的问题

如果你像这样在 VPS 上准确配置好 SSR 服务器端,接着又在自己电脑上准确配置好 SSR 客户端,但还是无法使用,一个可能的原因是相应的端口没有打开
这种情况最可能的一个原因是: 你配置 ShadowsocksR 的服务器不是纯净的。之前已经装了像 OneinStack、LNMP 这样的一键安装包,而这些脚本的防火墙规则默认关闭我们配置的 8001、8002、8003 这样的端口
下面以 8001 端口为例,来看下如何手动打开端口:
# 打开 8001 端口
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8001 -j ACCEPT
iptables -I INPUT -m state --state NEW -m udp -p udp --dport 8001 -j ACCEPT
# 如果要删除防火墙规则,关闭 8001 端口
iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport 8001 -j ACCEPT
iptables -D INPUT -m state --state NEW -m udp -p udp --dport 8001 -j ACCEPT
这样一来,我们就可以自由地在国际互联网上冲浪了。Enjoy !

2016年12月15日星期四

Android获取手机短信


  1. import android.content.pm.PackageManager;  
  2. import android.support.v4.app.ActivityCompat;  
  3. import android.support.v4.content.ContextCompat;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.os.Bundle;  
  6.   
  7. import android.app.Activity;  
  8. import android.database.ContentObserver;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.os.Message;  
  14. import android.widget.TextView;  
  15.   
  16. public class MainActivity extends AppCompatActivity {  
  17.   
  18.     private TextView vSms;//短信内容TextView  
  19.     private SMSContent smsObsever;//短信观察者  
  20.   
  21.     private Handler handler = new Handler() {  
  22.         public void handleMessage(android.os.Message msg) {  
  23.             Bundle bundle = msg.getData();  
  24.             String body = bundle.getString("body");  
  25.             vSms.setText(body);  
  26.         }  
  27.   
  28.         ;  
  29.     };  
  30.   
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.         vSms = (TextView) this.findViewById(R.id.tx_sms);//短信内容显示  
  36.         smsObsever = new SMSContent(handler);//实例化短信观察者  
  37.         //注册短信观察者  
  38.         getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsObsever);  
  39.     }  
  40.   
  41.     /** 
  42.      * @author Administrator 
  43.      * @description 短信观察者 
  44.      */  
  45.     class SMSContent extends ContentObserver {  
  46.         private Handler mHandler;  
  47.   
  48.         public SMSContent(Handler handler) {  
  49.             super(handler);  
  50.             mHandler = handler;  
  51.         }  
  52.   
  53.         @Override  
  54.         public void onChange(boolean selfChange) {  
  55.             super.onChange(selfChange);  
  56.             Cursor cursor = null;  
  57.             String body = null;  
  58.   
  59.             //申请读取短信的权限,需要与用户交互  
  60.             final int REQUEST_CODE_ASK_PERMISSIONS = 123;  
  61.             ActivityCompat.requestPermissions(MainActivity.thisnew String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS);  
  62.   
  63.             //读取之前判断一下是否已经渠道权限  
  64.             if (ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) {  
  65.                 try {  
  66.                     cursor = getContentResolver().query(  
  67.                             Uri.parse("content://sms/inbox"), nullnullnull,  
  68.                             "date desc");  
  69.                     if (cursor != null) {  
  70.                         if (cursor.moveToNext()) {//不遍历只拿当前最新的一条短信  
  71.                             //获取当前的短信内容  
  72.                             body = cursor.getString(cursor.getColumnIndex("body"));  
  73.                             Message msg = Message.obtain();  
  74.                             Bundle bundle = new Bundle();  
  75.                             bundle.putString("body", body);  
  76.                             msg.setData(bundle);  
  77.                             mHandler.sendMessage(msg);  
  78.                         }  
  79.   
  80.                     }  
  81.                 } catch (Exception e) {  
  82.                     e.printStackTrace();  
  83.                 } finally {  
  84.                     if (cursor != null) {  
  85.                         cursor.close();  
  86.                     }  
  87.   
  88.                 }  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     @Override  
  94.     protected void onDestroy() {  
  95.         super.onDestroy();  
  96.         //取消注册  
  97.         getContentResolver().unregisterContentObserver(smsObsever);  
  98.     }  



  1. <!--收短信的权限-->  
  2. <uses-permission android:name="android.permission.RECEIVE_SMS"/>  
  3. <!--读取短信信息的权限-->  
  4. <uses-permission android:name="android.permission.READ_SMS"/>  

2016年11月2日星期三

使用aapt工具获取android package信息

aapt 位于 android sdk下的build-tools工具 

使用方法 
aapt dump badging <apk name> 


ps.mac os 的sdk包默认不带这个工具,下载解压后添加到环境变量即可。

2016年10月31日星期一

编译shadowsocks-android工程

之前是买的ss的账号,每年的费用差不多300块RMB,服务也比较稳定。直至今日服务快要到期了准备打算自己创建一个服务器,尝试了一下服务器还算稳定youtube 720p也基本没什么问题。由于三方下载ss Android客户端程序有讨厌的广告借此机会编译一个无广告,并且拥有自己的默认账号的Android客户端程序,以便分享给朋友们。 

github https://github.com/fanfq/shadowsocks-android 

PREREQUISITES 

JDK 1.8 
SBT 0.13.0+ 
Go 1.4+ 
Android SDK 
Build Tools 25+ 
Android Support Repository and Google Repository (see build.sbt for version) 
Android NDK r12b+ 
BUILD 

Set environment variable ANDROID_HOME to /path/to/android-sdk 
Set environment variable ANDROID_NDK_HOME to /path/to/android-ndk 
Set environment variable GOROOT_BOOTSTRAP to /path/to/go 
Create your key following the instructions at https://developer.android.com/studio/publish/app-signing.html 
Create local.properties from local.properties.example with your own key information 
Invoke the building like this 
    git submodule update --init 

    # Build the App 
    sbt native-build clean android:package-release

git submodule update --init  这一步浪费较长的时间,甚至有点想放弃。丢那边放了2,3天后搞定了。 
主要问题就是纠结在 git ss代理配置 问题,后来解决了。前提是已经在电脑上安装了ss代理。 



git ss代理配置

#http、https代理的配置与取消 
git config --global https.proxy http://127.0.0.1:1080 
git config --global https.proxy https://127.0.0.1:1080 

git config --global --unset http.proxy 
git config --global --unset https.proxy 

#如果已使用ss代理,则通过socks5协议,通过命令行的方式走ss通道 
git config --global http.proxy 'socks5://127.0.0.1:1080' 
git config --global https.proxy 'socks5://127.0.0.1:1080' 

#也可以直接编辑配置文件 
vi ~/.gitconfig 

#vi常用指令tips 
dd 删除一行 
:w 存盘 
:q  退出 

ubuntu sbt 安装



真的还是第一次听说过sbt,没想到如此之牛逼。不是编译程序用到还真的接触不到这么吊炸天的玩意。 

可以下载文件包安装 http://www.scala-sbt.org/download.html 

也可用通过apt-get方式安装(推荐使用),从下载连接处也可以得到此指令 
$echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
$sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
$sudo apt-get update
$sudo apt-get install sbt