微信摇一摇签到 解决方案

所在学校在2016年的时候 使用了 微信摇一摇作为签到的系统

摇一摇签到是基于 iBeacon(低功耗蓝牙通信)

iBeacon 组成

iBeacon 由 UUID Major Minor 组成
那么 理论上我们只要获取到了以上信息 就能在任何地方(一般都会进行定位认证 所以任何地方是有条件的)发射出一个教室的信号 进行摇一摇签到

  1. 获取微信摇一摇的 UUID(唯一标识符) 能从微信摇一摇的开发页面上得到

UUID = FDA50693-A4E2-4FB1-AFCF-C6EB07647825

  1. Major 开发者决定 一般是指区域信息

Major = 10099

  1. Minor 开发者决定 在这篇文章中指的是 学校的教室号

Minor = 随便你写一个就好

实际测试得知 学校的签到系统 没有对签到的教室进行认证 换句话说 你爱签哪个教室都行
只要你签到了 就显示签到成功了

另外 学校的这套系统并没有定位认证 一般做这种摇一摇的系统 都是要进行定位确认的
抓包得知 只是假模假样的 post 个 Position 但并没有后台确认(真的很会偷懒)

代码实现

以下为 Swift 的代码实现(大一时所写) 直接做成 App 装在 iPhone 上面 一打开就能摇一摇签到(自己摇不到 只能给别人摇)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import UIKit
import CoreLocation
import CoreBluetooth

private let uuid = UUID(uuidString: "FDA50693-A4E2-4FB1-AFCF-C6EB07647825")

class ViewController: UIViewController {
fileprivate lazy var data = NSMutableDictionary()
fileprivate lazy var manager = CBPeripheralManager()

override func viewDidLoad() {
super.viewDidLoad()
let major: CLBeaconMajorValue = 10099
let minor: CLBeaconMinorValue = 21920
let beaconRegion = CLBeaconRegion(proximityUUID: uuid!, major: major, minor: minor, identifier: "id")
data = beaconRegion.peripheralData(withMeasuredPower: nil)
manager = CBPeripheralManager(delegate: self, queue: nil)
}
}

extension ViewController: CBPeripheralManagerDelegate {
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
self.manager.startAdvertising(self.data as? [String : Any])
}
}