微信开发 数据库

2020-01-12 13:49:05 qq_44001007 阅读数 516

本文主要讲述python程序对微信云开发数据库的操作。

一、直接操作

直接操作指的是通过python程序对云开发数据库直接进行操作。
所有的操作前提都是在获取access_token下进行的,先通过下列代码获取access_token在进行接下来的操作。

    def access_token():
        """"
           获取access_token
        """
        APPID = '**********'                        //小程序ID
        APPSECRET = '**************'                //小程序秘钥
        WECHAT_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' + APPID + '&secret=' + APPSECRET
        response = requests.get(WECHAT_URL)
        result = response.json()
        return result["access_token"]     //将返回值解析获取access_token

1.1 创建集合

此方法的创建只需要将集合的名字post给数据库即可。

 def databaseCollectionAdd(access_token):
        """"
           创建数据库
        """
        url = 'https://api.weixin.qq.com/tcb/databasecollectionadd?access_token'+access_token
        data={
              "env":"******",                //用户的数据库环境ID
              "collection_name": "*******"   //数据库集合的名称
              }
        response = requests.post(url, data=json.dumps(data))
        result = response.json()
        print(result)     //将返回值打印

1.2 查询记录

将集合的名字Post即可返回该集合的信息。

    def databaseQuery(access_token,collection_name):
        """"
            检索数据库
           collection_name 集合的名称
           .limit() 括号内的数值限定返回的记录数
        """
        url = 'https://api.weixin.qq.com/tcb/databasequery?access_token=' + access_token
        data = {
            "env": "*******",          //用户的数据库环境ID
            "query": "db.collection(\""+collection_name+"\").limit(100).get()"
        }
        response = requests.post(url, data=json.dumps(data))
        result = response.json()
        print(result)     //将返回值打印

1.3 插入记录

通过Post集合名字和Add函数对内容(datas)的传输。

    def databaseAdd(access_token,collection_name):
        """"
        新建记录并对内容进行定义
        collection_name 集合的名称
        """
        url = 'https://api.weixin.qq.com/tcb/databaseadd?access_token' + access_token
        data = {
            "env": "",
            "query": "db.collection(\""+collection_name+"\").add({"+datas+"})"
        }
        datas=[{
        "字段名称""内容"
        """
        这里主要是对创建记录的直接定义
        """
              }]
        response = requests.post(url, data=json.dumps(data))
        result = response.json()
        print(result)     //将返回值打印

经测试这种创建记录的方式对datas的定义要求较为严格,一但定义不够严格会出现创建失败,所以建议通过间接的方式对数据库进行插入记录。

1.4 删除记录

通过Post集合名称将该集合直接从数据库移除。

  def databaseQuery(access_token,collection_name):
      """"
         collection_name 集合的名称
      """
      url = 'https://api.weixin.qq.com/tcb/databasedelete?access_token=' + access_token
      data = {
          "env": "*******",          //用户的数据库环境ID
          "query": "db.collection(\""+collection_name+"\")..where({done:false}).remove()"
      }
      response = requests.post(url, data=json.dumps(data))
      result = response.json()
      print(result)     //将返回值打印

1.5 更新记录

更新记录是对已有的记录内容进行修改,所以说想要对记录内容修改不可用.add()进行,通过.update()进行内容修改

    def databaseUpdate(access_token,collection_name):
        """"
        .where() 该集合所在记录的检索
        """
        url = 'https://api.weixin.qq.com/tcb/databaseadd?access_token' + access_token
        data = {
            "env": "",
            "query": "db.collection(\""+collection_name+"\").where({age:14}).update({data:{age: _.inc(1)}})""
        }
       """
       这个例子是将集合里age=14所有记录自增1
       """
        response = requests.post(url, data=json.dumps(data))
        result = response.json()
        print(result)     //将返回值打印

更新是对记录的操作,所以很需要.where()的帮助,请大家牢记该函数的使用。

总结

这是通过对微信小程序一段时间的学习后总结出来的,本作者是个新人,如有错误可指出,我将及时改正。
第二部分是通过调用云函数来对数据库进行操作,这种方法的BUG似乎比直接操作少。
如有问题可以加QQ:1375451299交流学习

2018-09-21 15:29:21 qq_40999496 阅读数 57395

开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。

云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。

目前提供三大基础能力支持:

           1、云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码

           2、数据库:一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库

           3、存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理

具体的可以去小程序文档上查看,下面用一个登录注册的案例来演示小程序云开发数据库的运用

注册

在创建的时候,要在点下一步的时候,调数据库来看用户名有没有重复的。在点击同意的时候来调用数据库,然后把所有的判断放到下一步来判断。所有条件都满足就将用户名和密码放到全局变量中。

var app = getApp();
Page({
  data: {
    userName: '',
    userPassword: '',
    userPasswordAgain: '',
    checkbox: false,
    repetition: false
  },
  // 返回主页面
  backHomeTap: function() {
    wx.switchTab({
      url: '../index/index',
    })
  },
  // 绑定
  bindingTap: function () {
    wx.redirectTo({
      url: '../login/login',
    })
  },
  // 用户名
  userNameInput: function(e) {
    this.setData({
      userName: e.detail.value
    });
  },
  // 密码
  userPasswordInput: function(e) {
    this.setData({
      userPassword: e.detail.value
    });
  },
  // 再次输入密码
  userPasswordAgainInput: function(e) {
    this.setData({
      userPasswordAgain: e.detail.value
    });
  },
  // 同意
  checkboxChange: function() {
    if (this.data.checkbox === false) {
      this.setData({
        checkbox: true
      })
    } else {
      this.setData({
        checkbox: false
      })
    }
    var that = this;
    var userName = this.data.userName;
    // 初始化云
    wx.cloud.init({
      env: 'wubaib-9543f7',
      traceUser: true
    });
    // 初始化数据库
    const db = wx.cloud.database();
    const _ = db.command;
    db.collection('userInformation').where({
      userName: _.eq(userName)
    }).get({
      success: function (res) {
        if (res.data.length === 1) {
          that.setData({
            repetition: true
          })
        }
      }
    })
  },
  // 下一步,完善个人信息
  perfectInforTap: function() {
    var userName = this.data.userName;
    var userPassword = this.data.userPassword;
    var checkbox = this.data.checkbox;
    var userPasswordAgain = this.data.userPasswordAgain;
    var name = /^[A-Za-z0-9\u4e00-\u9fa5]+$/;
    var repetition = this.data.repetition;
    if (userName === '') {
      wx.showToast({
        title: '请输入用户名',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (!name.test(userName)) {
      wx.showToast({
        title: '用户名格式不正确',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (repetition === true) {
      wx.showToast({
        title: '用户名已存在',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (userPassword === '') {
      wx.showToast({
        title: '请输入密码',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (userPassword.length < 6) {
      wx.showToast({
        title: '密码最少6位',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (userPassword !== userPasswordAgain) {
      wx.showToast({
        title: '两次密码输入不一致',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (checkbox === false) {
      wx.showToast({
        title: '请选中已阅读',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else {
      wx.redirectTo({
        url: 'perfectInfor/perfectInfor',
      })
      // 保存用户名和密码
      app.appData.account = {
        userName: userName,
        userPassword: userPassword
      }
    }
  }
})

在完善信息的时候获取所有的变量(用户名和密码也在内),然后在点击下一步完成按钮将数据上传到数据库。

​
var app = getApp();
Page({
  data: {
    userName: '',
    userPassword: '',
    phone: '',
    realName: '',
    card: '',
    email: '',
  },
  // 返回主界面
  backHomeTap: function() {
    wx.switchTab({
      url: '../../index/index',
    })
  },
  // 手机号
  phoneInput: function(e) {
    this.setData({
      phone: e.detail.value
    });
  },
  // 真实姓名
  nameInput: function(e) {
    this.setData({
      realName: e.detail.value
    });
  },
  // 身份证
  cardInput: function(e) {
    this.setData({
      card: e.detail.value
    })
  },
  // email
  emailInput: function(e) {
    this.setData({
      email: e.detail.value
    })
  },
  // 下一步完成
  registerSuccessTap: function() {
    var phone = this.data.phone;
    var realName = this.data.realName;
    var card = this.data.card;
    var email = this.data.email;
    var userName = this.data.userName;
    var userPassword = this.data.userPassword;
    var phonereg = /^1[345789]\d{9}$/;
    var namereg = /^[\u4E00-\u9FA5]+$/;
    var cardreg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/;
    var emailreg = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;
    var that = this;
    if (phone === '') {
      wx.showToast({
        title: '请输入手机号',
        icon: 'none',
        duration: 2000,
        mask: true
      });
    } else if (!phonereg.test(phone)) {
      wx.showToast({
        title: '请输入正确的手机号',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (!namereg.test(realName)) {
      wx.showToast({
        title: '请输入正确的名字',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (card === '') {
      wx.showToast({
        title: '请输入身份证',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (!cardreg.test(card)) {
      wx.showToast({
        title: '请输入正确的身份证',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (email === '') {
      wx.showToast({
        title: '请输入邮箱',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else if (!emailreg.test(email)) {
      wx.showToast({
        title: '请输入正确的邮箱',
        icon: 'none',
        duration: 2000,
        mask: true
      })
    } else {
      // 初始化云
      wx.cloud.init({
        env: 'wubaib-9543f7',
        traceUser: true
      });
      // 初始化数据库
      const db = wx.cloud.database();
      db.collection('userInformation').add({
        // data 字段表示需新增的 JSON 数据
        data: {
          realName: realName,
          userName: userName,
          userPassword: userPassword,
          phone: phone,
          email: email,
          card: card
        },
        success: function(res) {
          // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
          console.log(res);
          console.log(res.errMsg);
        }
      })
    }
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function() {
    this.setData({
      userName: app.appData.account.userName,
      userPassword: app.appData.account.userPassword
    })
  },
})

​

登录

在登录页面,先获取用户输入的用户名和密码。在点击登录的时候,先根据userName调数据库的密码和用户输入的密码是否相等。如果相等将用户的信息保存到全局变量中。

​
var app = getApp();
Page({
  data: {
    bindName: '',
    bindPassword: '',
    isChecked: false,
    userName: '',
    phone: '',
    realName: '',
    card: '',
    email: '',
    userId: ''
  },
  // 点击注册账号
  registerTap: function() {
    wx.redirectTo({
      url: '../register/register'
    })
  },
  // 获取用户名
  bindNameInput: function(e) {
    this.setData({
      bindName: e.detail.value
    })
    var that = this;
    if (that.data.bindName.length !== 0 && that.data.bindPassword.length !== 0) {
      this.setData({
        isChecked: true
      })
    } else if (that.data.bindName.length === 0) {
      this.setData({
        isChecked: false
      })
    }
  },
  // 获取密码
  bindPasswordInput: function(e) {
    this.setData({
      bindPassword: e.detail.value
    })
    var that = this;
    if (that.data.bindName.length !== 0 && that.data.bindPassword.length !== 0) {
      this.setData({
        isChecked: true
      })
    } else if (that.data.bindPassword.length === 0) {
      this.setData({
        isChecked: false
      })
    }
  },
  // 点击登录
  bindingSuccess: function() {
    var that = this;
    var bindName = that.data.bindName;
    var bindPassword = that.data.bindPassword;
    if (bindName.length !== 0 && bindPassword.length !== 0) {
      // 初始化云
      wx.cloud.init({
        env: 'wubaib-9543f7',
        traceUser: true
      });
      // 初始化数据库
      const db = wx.cloud.database();
      db.collection('userInformation').where({
        userName: bindName
      }).get().then(res => {
        console.log(res.data);
        if (res.data[0].userPassword === bindPassword) {
          console.log("登录成功");
          // 保存手机号,真实姓名,身份证号,邮箱 保存用户名
          that.setData({
            userName: res.data[0].userName,
            phone: res.data[0].phone,
            realName: res.data[0].realName,
            card: res.data[0].card,
            email: res.data[0].email,
            userId: res.data[0]._id
          })
          app.appData.userinfo = {
            phone: that.data.phone,
            realName: that.data.realName,
            card: that.data.card,
            email: that.data.email
          }
          app.appData.account = {
            userName: that.data.userName
          }
          app.appData.userId = {
            userId: that.data.userId
          }
          wx.switchTab({
            url: '../personalCenter/personalCenter',
          })
        } else {
          wx.showToast({
            title: '用户名或密码错误',
            icon: 'none',
            duration: 2000
          })
        }
      })
    }
  },
})

​

登录WXML

<view class='phoneNumberContainer'>
  <input placeholder='用户名' maxlength='11' bindinput="bindNameInput"></input>
</view>
<view class='passwordContainer'>
  <input placeholder='密码' password="true" bindinput="bindPasswordInput"></input>
</view>
<view class="{{isChecked?'bindingChecked':'bindingNormal'}}" bindtap='bindingSuccess'>立即登录</view>
<view class='registerContainer' bindtap='registerTap'>注册账号</view>

注册第一步的WXML

<!--返回主页  -->
<view class='backHome' bindtap='backHomeTap'>
  <image src='/images/homeIcon.png' class='backHomeImg'></image>
</view>
<!--头部  -->
<view class='headerContainer'>
  <!--创建账户  -->
  <view class='headerListContainer headerListActive'>
    <view class='headerListView'>1</view>
    <text class='headerListText'>创建账户</text>
  </view>
  <!--完善个人信息  -->
  <view class='headerListContainer'>
    <view class='headerListView'>2</view>
    <text class='headerListText'>完善个人信息</text>
  </view>
  <!--注册成功  -->
  <view class='headerListContainer'>
    <view class='headerListView'>3</view>
    <text class='headerListText'>注册成功</text>
  </view>
  <view class='transverseLineLeft'></view>
  <view class='transverseLineright'></view>
</view>
<view class='mainContainer'>
  <!--用户名  -->
  <view class='mainListContainer'>
    <view class='mainListText'>用户名</view>
    <input class='mainListInput' placeholder='请输入数字,字母或中文' maxlength='25' bindinput='userNameInput'></input>
  </view>
  <!--密码  -->
  <view class='mainListContainer'>
    <view class='mainListText'>密码</view>
    <input class='mainListInput' placeholder='长度6~14位' password='true' maxlength='14' bindinput='userPasswordInput'></input>
  </view>
  <!--确认密码  -->
  <view class='mainListContainer'>
    <view class='mainListText'>确认密码</view>
    <input class='mainListInput' placeholder='请再次输入密码' password='true' maxlength='14' bindinput='userPasswordAgainInput'></input>
  </view>
</view>
<!--agree  -->
<view class='agreeContainer'>
  <checkbox class='agreeCheckbox' checked="{{check}}" bindtap="checkboxChange"/>
  <text>我已阅读并接受</text>
  <text class='clause'>《用户注册条款》</text>
</view>
<!--nextButton  -->
<view class='nextButton' bindtap='perfectInforTap'>下一步,完善个人信息</view>
<!--binding  -->
<view class='bindingContainer'>
  <text>已有账号</text>
  <text class='binding' bindtap='bindingTap'>请绑定</text>
</view>

注册第二步WXML

<!--返回主页  -->
<view class='backHome' bindtap='backHomeTap'>
  <image src='/images/homeIcon.png' class='backHomeImg'></image>
</view>
<!--头部  -->
<view class='headerContainer'>
  <!--创建账户  -->
  <view class='headerListContainer headerListOldActive'>
    <view class='headerListView'>1</view>
    <text class='headerListText'>创建账户</text>
  </view>
  <!--完善个人信息  -->
  <view class='headerListContainer headerListActive'>
    <view class='headerListView'>2</view>
    <text class='headerListText'>完善个人信息</text>
  </view>
  <!--注册成功  -->
  <view class='headerListContainer'>
    <view class='headerListView'>3</view>
    <text class='headerListText'>注册成功</text>
  </view>
  <view class='transverseLineLeft'></view>
  <view class='transverseLineright'></view>
</view>
<!--main  -->
<view class='mainContainer'>
  <!--手机  -->
  <view class='mainListContainer'>
    <view class='mainListText'>手机</view>
    <input class='mainListInput' placeholder='请输入手机号码' maxlength="11" bindinput='phoneInput'></input>
  </view>
  <!--真实姓名  -->
  <view class='mainListContainer'>
    <view class='mainListText'>真实姓名</view>
    <input class='mainListInput' placeholder='请输入真实姓名' maxlength='25' bindinput='nameInput'></input>
  </view>
  <!--证件类型  -->
  <view class='mainListContainer'>
    <view class='mainListText'>证件类型</view>
    <view class='cardText'>中华人民共和国居民身份证</view>
  </view>
  <!--证件号码  -->
  <view class='mainListContainer'>
    <view class='mainListText'>证件号码</view>
    <input class='mainListInput' type='idcard' placeholder='请输入身份证号码' maxlength="18" bindinput='cardInput'></input>
  </view>
  <!--邮箱  -->
  <view class='mainListContainer'>
    <view class='mainListText'>邮箱</view>
    <input class='mainListInput' placeholder='请输入常用的邮箱地址' bindinput='emailInput'></input>
  </view>
</view>
<!--nextButton  -->
<view class='nextButton' bindtap='registerSuccessTap'>下一步,完成</view>

好多人问我要源码,我就不一个一个发了。要源码的自己git下载吧

下载地址:https://github.com/wubaibin/wx_yunkaifa.git

2017-10-30 20:06:39 landiljy 阅读数 1292
1.初始化数据库

我用的是新浪SAE上的MYSQL。

官方文档:https://www.sinacloud.com/doc/sae/php/mysql.html#api-shi-yong-shou-ce

2.查询语句

链接数据库:(SAE提供了基于MYSQL模块的SaeMysql类)

$mysql = new SaeMysql();

直接实例化即完成链接操作,无须进行其他操作。

例如:

增加数据:(注意weixin附近的不是单引号,是TAB键上面那个键的值)

$mysql = new SaeMysql();

$sql = "insert into `weixin`(`id`,`title`,`content`) values(null,"haha",:"gaga")";

3.公众号关键词查询

 1 case "text"://文本消息
 2                     if($keyword == "天气"){
 3                         $weatherurl="http://api.map.baidu.com/telematics/v3/weather?location=杭州&ak=f6UkU0QqVAhABUeGKSxZBCeb";
 4                         $apistr = file_get_contents($weatherurl);
 5                         $apiobj = simplexml_load_string($apistr);
 6                         $placeobj = $apiobj->results->currentCity;//读取城市名
 7                         $todayobj = $apiobj->results->weather_data->date;//读取当前时间
 8                         $weatherobj = $apiobj->results->weather_data->weather;//读取天气
 9                         $windobj = $apiobj->results->weather_data->wind;//读取风力
10                         $temobj = $apiobj->results->weather_data->temperature;//读取温度
11                         $pm25obj = $apiobj->results->pm25;//读取pm2.5
12                         $contentStr = "{$placeobj}{$todayobj},天气:{$weatherobj},风力:{$windobj},温度:{$temobj},pm2.5:{$pm25obj}.";
13                     }else{
14                         $mysql = new SaeMysql();
15                         $sql = "select * from `weixin` where `title` like '%{$keyword}%'";
16                         $data = $mysql->getData($sql);
17                         if($data == null){
18                             $contentStr = "Hi,海仙日用百货欢迎您!\n回复数字'1',了解店铺地址.\n回复数字'2',了解商品种类.\n"
19                             ."回复'天气',获取杭州天气情况.\n发送语音消息和地理位置信息,有更多惊喜等着你.";
20                         }else{
21                             $contentStr = $data[0][content];
22                         }
23                     }
24                     break;
关键词查询

4.识别新老用户

     手机微信客户端传输到微信公众账号的用户信息为加密的openid,保存在变量$fromUsername中,我们可以将$fromUsername保存到数据库中,从而实现CRM(客户关系管理)。

新建数据表crm:

1 CREATE TABLE  `app_landiljy`.`crm` (
2 `id` INT NOT NULL AUTO_INCREMENT ,
3 `user` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
4 PRIMARY KEY (  `id` )
5 ) ENGINE = INNODB;
create table

先判断是新客户还是老客户,当新客户发送“你好”时,回复“欢迎新朋友”;当老客户发送“你好”时,回复“欢迎老朋友”。

 1 if($keyword == "你好" || $keyword == "您好"){
 2                         $mysql = new SaeMysql();
 3                         $sql = "select * from `crm` where `user` = '{$fromUsername}'";
 4                         $data = $mysql->getData($sql);
 5                         $user = $data[0][user];
 6                         if(empty($user)){
 7                              $sql="insert into `crm`(`id`,`user`) values(null,'{$fromUsername}')";
 8                              $mysql->runSql($sql);
 9                              $contentStr = "欢迎新朋友";
10                         }else{
11                              $contentStr = "欢迎老朋友";
12                         }
crm

 

2019-07-23 11:04:37 fmwater 阅读数 665

大家好,本章和大家聊下微信商城的数据库的简要说明,首先此系统是基于jeesite1.2.7系统开发的,所以里面基础表结构沿用原先系统的表结构,没有做删除,大家可以用这套框架来继续开发其他类型的项目。比如办公OA,企业的各种管理系统等

首先表全部以 XXX(模块名)_业务表明来区分

act开头的是原先系统的业务流程表名称

cms开头的是内容管理模块

qrtz是定时器相关表结构

report是报表系统

sys是系统数据库结构表

ws开头是微信商城业务表

wx是微信公众号开发的各种表数据  

在这里我着重把ws商城的表结构做下说明

ws_actiity 是活动的相关表 

ws_ad 广告表

ws-address地址表

ws-announcement公告表

ws-brand 商品品牌

ws-cart购物车

ws-consuluation 商品评论表

ws_ex_carrymode运费模型

ws_ex_faretemplate运费模板

ws_ex_inclpostageproviso包邮模板

ws_link  连接地址

ws_link_category连接地址类型

ws_member会员表

ws_member_attr 会员属性表

ws_member_collect_log 会员收藏记录

ws_member_consume_log用户消费记录

ws_member_coupon用户优惠卷

ws_member_recharge_log用户充值记录

ws_member_reward_log用户返利记录

ws_member_search_log用户搜索记录

ws_member_visit_log用户访问记录

ws_message用户消息表

ws_message_record消息发送记录

ws_mrank用户级别

ws_order用户订单

ws_order_item用户订单项

ws_prod_attr商品属性表(暂时未用)

ws_prod_attribute商品属性

ws_prod_attrivalue商品属性字表

ws_prod_category产品分类

ws_prod_sku产品sku

ws_prod_sku_attr产品sku子表

ws_product商品表

ws_return退货主表

ws_return_item退货子表

ws_warn  数据报警表记录

wx相关的为微信的配置表

商城的表结构大体为以上内容,后期随着开发过程补充完善

2017-01-12 15:11:08 hycfire 阅读数 2541

特别声明:本文章只是用于技术交流,不可用于非法行为。

 阅读过上篇文章后,我想你一定去取出来微信本地数据库文件EnmicroMsg.db,但是取出来有什么用呢?又打不开,加密了。好比邂逅了个穿着铁内裤的女人。你得找到钥匙,密码。

加密方式是:

(手机IMEI + 微信uin )取MD5的前7位

另外在此处补充一句,上篇文章提到的以MD5加密后的字符串为名文件夹。这个文件夹的名字的产生方式是:

(mm+微信uin)取MD5字符串

MD5取的 都是 32位 小写

那么问题来了,怎么获取到 手机IMEI 和 微信uin?

手机IMEI获取最是容易,在手机拨号 *#06# 就有显示。

微信uin,你可以选择抓包获取。

然后下载SQLCipher.exe,输入密码,打开。

我之前网上百度了好多文章,其中一个写的还不错SQLCipher.exe这个软件,打开.db文件时,输入计算出来的密码后,就可以打开EnMicroMsg.db文件了


IMEI,输入 *#06#  可能出现多个,取的是MEID,我就取错过。当然,作为一个开发人员,我们还是写代码获取比较靠谱

public static String getDeviceId(Context mContext) {
    TelephonyManager tm = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
    return tm.getDeviceId();
}

uin,这个最简单的办法就是登陆网页版微信,F12,看网页元素

然后和朋友互发消息


从这儿你能取到uin。

然后,

(手机IMEI + 微信uin )取MD5的前7位 获取数据库密码。最后,下载个SQLCipher.exe这个软件,打开.db文件时,输入计算出来的密码后,就可以打开EnMicroMsg.db文件了。

有人问代码能不能获取到,但我突然意识到,很多小公司,小app,有煞笔老板会要求程序员获取手机中的通讯录,获取微信好友,来壮大自己的数据库。这是给程序员增加负担,我还是不上传源码吧。或许将来我会做个jar包的