Both sides previous revisionPrevious revisionNext revision | Previous revision |
packet:bpq-api [2024/10/06 20:02] – [The one Tom built] m0lte | packet:bpq-api [2025/01/02 19:13] (current) – [Route Roadmap] m0lte |
---|
===== The one built into BPQ ===== | ===== The one built into BPQ ===== |
| |
BPQ has a latent, undocumented, API, which Steve is going to document here :D | BPQ has a simple and evolving HTTP REST API. |
| It is used though the HTTPPORT (in this example is port 9122) |
| |
| endpoints: (note older versions were prefixed with 'get' (except request_token) |
| |
| <code> |
| /api/request_token |
| /api/ports |
| /api/nodes |
| /api/users |
| /api/info |
| /api/links |
| /api/mheardport/<port#> |
| </code> |
| |
| Requested like so: |
| <code>curl 127.0.0.1:9122/api/request_token</code> |
| |
| Output: |
| <code>{"access_token":"OSTWFHSGAPKZWMZORFEFWOFIHMOZUMJK", "expires_in":3600, "scope":"create"}</code> |
| |
| Example of MH for Port 1: ( >ver 6.0.24.33 ) |
| <code>curl 127.0.0.1:9122/api/mheardport?1 -H "Authorization: Bearer OSTWFHSGAPKZWMZORFEFWOFIHMOZUMJK"</code> |
| |
| Output: |
| <code>{"callSign": "G7TAJ-15", "port": "1", "packets": 10, "lastHeard": "2024-3-6 17:14:01" }, |
| {"callSign": "G7TAJ", "port": "1", "packets": 5, "lastHeard": "2024-3-3 15:46:07" }</code> |
| |
| ==== Route Roadmap ==== |
| |
| Detailed info about the routes that exist and those yet to come. |
| |
| ^ Route ^ Method ^ Description ^ Authentication required? ^ Implemented? ^ Example response ^ |
| | /api/request_token | GET | Get a token that you will need for authenticated routes | no | yes | `{ "access_token":"TJFCQDBRVSSHGPWIXFHAJFFKSMZISADL", "expires_in":3600, "scope":"create" }` | |
| | /api/ports | GET | A list of the available ports | no | yes | `{ "ports": [ {"ID":"Telnet Server (internal only)", "Driver":"TELNET", "Number":1,"State":"Open"}, {"ID":"AX/IP/UDP", "Driver":"BPQAXIP", "Number":2,"State":"Open"}, {"ID":"2m FM 144.950 MHz 1.2k", "Driver":"ASYNC", "Number":3,"State":"Open"} ] }` | |
| | /api/nodes | GET | A list of known nodes | no | yes | `{ "nodes": [ { "Call":"G4ZJH-7", "Alias":"SAXNOD", "Routes": [ {"Call":"G4ZJH-7", "Port":2, "Quality":192}, {"Call":"GB7PKT", "Port":2, "Quality":144}, {"Call":"GB7MSX", "Port":2, "Quality":144}]} ] }` | |
| | /api/users | GET | A list of currently active users | no | yes | `{ "users": [ {"Call": "M7GMT"} ] }` | |
| | /api/info | GET | Basic info about the node | no | yes | `{ "info": { "NodeCall":"M7GMT-5", "Alias":"WYMOND", "Locator":"JO02nn", "Version":"6.0.24.42" } }` | |
| | /api/links | GET | A list of current links to other nodes | no | yes | `{ "links": [ {"farCall":"GB7MSX", "ourCall":"M7GMT-5", "port":"2", "state":"Active", "linkType":"Node-Node", "ax25Version":"2"} ] }` | |
| | /api/mheard/<port#> | GET | A list of stations that have been recently heard on a specific port | no | yes | | |
| | /api/routes | GET | A list of available routes | no | no | | |
| | /api/stats | GET | Version, uptime stats, etc | no | no | | |
| | /api/v1/mail/msgs | GET | Gets a list of messages | yes | yes but incomplete responses | | |
===== The one Tom built ===== | ===== The one Tom built ===== |
| |
| |
https://github.com/M0LTE/bpqapi | https://github.com/M0LTE/bpqapi |
| |
| |
| ==== UI scraping notes from Steve G7TAJ ==== |
| |
| Getting a message list with parameters |
| |
| M$ID = the token |
| |
| the options can be null |
| |
| <code>/Mail/MsgInfo.txt?M$ID --data "<FROM>|<TO>|<VIA>|<BID>|"</code> |
| |
| response: a list of message numbers delimitered by | (odd end of html at the end) |
| |
| <code>1234|1235|1236|</body></html></code> |
| |
| |
| Get the message header information |
| |
| <code>/Mail/MsgDetails?M$ID --data "54144"</code> |
| |
| |
| <code> |
| <html> |
| <head> |
| <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> |
| <title>MsgEdit</title> |
| </head> |
| <body> |
| <h4>Message 54144</h4> |
| <form style="font-family: monospace;" method=post action=/Mail/Msg?M0000FBE24729 name=Msgs> |
| From <input style="font-family: monospace;" size=10 name=From value=CX2SA> |
| Sent <input readonly=readonly size=12 name=Sent value="06-Oct 11:33Z"> |
| Type |
| <select tabindex=1 size=1 name=Type> |
| <option selected value=B>B</option> |
| <option value=P>P</option> |
| <option value=T>T</option> |
| </select> |
| <br> |
| To <input style="font-family: monospace;" size=10 name=To value=NTS> |
| Received <input readonly=readonly size=12 name=RX value="06-Oct 12:05Z"> |
| Status |
| <select tabindex=1 size=1 name=Status> |
| <option value=N>N</option> |
| <option value=Y>Y</option> |
| <option value=F>F</option> |
| <option value=K>K</option> |
| <option value=H>H</option> |
| <option value=D>D</option> |
| <option selected value=$>$</option> |
| </select> |
| <br> |
| BID <input style="width:100px; font-family: monospace; " name=BID value="NTS092024"> |
| Last Changed <input readonly=readonly size=12 name=LastChange value="06-Oct 12:05Z"> |
| Size <input readonly=readonly size=5 name=Size value=18347> |
| <br> |
| <br> |
| Email From <input style="width:320px;" name=EFROM value=> |
| <br> |
| VIA <input style="width:360px;" name=VIA value=ARRL> |
| <br> |
| Title <input style="width:360px;" name=Title value="September 2024 NTS Letter"> |
| <br> |
| <br> |
| <span align=center> |
| <input onclick=editmsg("EditM?M0000FBE24729?54144" ) value="Edit Text" type=button class='btn'> |
| <input onclick=save(this.form) value=Save type=button class='btn'> |
| <td> |
| <a href=/Mail/SaveMessage?M0000FBE24729> |
| <button type=button class='btn'>Save Message</button> |
| </a> |
| </td> |
| <td> |
| <a href=/Mail/SaveAttachment?M0000FBE24729> |
| <button type=button class='btn' disabled>Save Attachment</button> |
| </a> |
| </td> |
| <input onclick=doit("Print" ) value=Print type=button class='btn'> |
| <input onclick=doit("Export" ) value=Export type=button class='btn'> |
| </span> |
| <br> |
| <br> |
| Green = Sent, Yellow = Queued |
| <table style="text-align: left; width: 490px; font-family: monospace; align=center " border=1 cellpadding=2 cellspacing=2> |
| <tr> |
| <td style="background-color: #FFFFFF;" onclick=ck("13" )>G6JME</td> |
| <td style="background-color: #FFFFFF;" onclick=ck("16" )>G7TAJ</td> |
| <td style="background-color: #FFFFFF;" onclick=ck("2" )>G8BPQ</td> |
| <td style="background-color: #FFFFFF;" onclick=ck("14" )>GB7BED</td> |
| <td style="background-color: #FFFFFF;" onclick=ck("8" )>GB7BEX</td> |
| <td style="background-color: #FFFFFF;" onclick=ck("12" )>GB7BPQ</td> |
| <td style="background-color: #FFFFFF;" onclick=ck("52" )>GB7BTN</td> |
| <td style="background-color: #98FFA0;" onclick=ck("37" )>GB7CIP</td> |
| </tr> |
| </table> |
| </form> |
| </body> |
| </html> |
| |
| </code> |
| |
| |
| Get the message body: |
| |
| <code>Mail/EditM?M0000FBE24729?54144</code> |
| |
| response: |
| |
| <code> |
| <html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title></title></head><body><form style="font-family: monospace; text-align: center;"method=post action=EMSave?M0000FBE24729><textarea cols=90 rows=33 name=Msg>R:241006/1157Z [email protected] LinBPQ6.0.24 |
| R:241006/1137Z [email protected] LinBPQ6.0.24 |
| R:241006/1137Z [email protected] BPQ6.0.24 |
| R:241006/1136Z 58099@VA3TOK.#SCON.ON.CAN.NOAM LinBPQ6.0.24 |
| R:241006/1136Z 22497@VE3CGR.#SCON.ON.CAN.NOAM LinBPQ6.0.24 |
| R:241006/1135Z 49830@KA1VSC.#CCT.CT.USA.NOAM LinBPQ6.0.24 |
| R:241006/1135Z 8927@WG3K.#SMD.MD.USA.NOAM LinBPQ6.0.24 |
| R:241006/1133Z 17075@N3HYM.#FRDK.MD.USA.NOAM BPQ6.0.24 |
| R:241006/1133Z @:CX2SA.SAL.URY.SOAM #:44327 [Salto] FBB7.00e $:NTS092024 |
| |
| From: [email protected] |
| To : NTS@ARRL |
| |
| ========================= |
| September 2024 NTS Letter |
| ========================= |
| September 3, 2024 |
| </code> |
| <color #ed1c24>SNIP</color> |
| <code> |
| </textarea><br><br><input name=Save value=Save type=submit class='btn'><input name=Cancel value=Cancel type=submit class='btn'><br></form></body></html> |
| |
| </code> |
| |
===== The one Twom is building ===== | ===== The one Twom is building ===== |
| |
Twom is patching MQTT support into BPQ itself. | Twom is patching MQTT support into BPQ itself. |