mirror of
https://github.com/public-transport/db-vendo-client.git
synced 2025-02-23 15:19:35 +02:00
prepare move to public-transport org
This commit is contained in:
parent
e71908ed1c
commit
98139f9210
8 changed files with 18 additions and 18 deletions
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
This guide is about writing such a profile. If you just want to use an already supported endpoint, refer to the [API documentation](readme.md) instead.
|
This guide is about writing such a profile. If you just want to use an already supported endpoint, refer to the [API documentation](readme.md) instead.
|
||||||
|
|
||||||
*Note*: **If you get stuck, ask for help by [creating an issue](https://github.com/derhuerst/hafas-client/issues/new)!** We want to help people expand the scope of this library.
|
*Note*: **If you get stuck, ask for help by [creating an issue](https://github.com/public-transport/hafas-client/issues/new)!** We want to help people expand the scope of this library.
|
||||||
|
|
||||||
## 0. How do the profiles work?
|
## 0. How do the profiles work?
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ If you pass this profile into `hafas-client`, the `parseLine` method will overri
|
||||||
1. **Get an iOS or Android device and download the "official" app** for the public transport provider that you want to build a profile for.
|
1. **Get an iOS or Android device and download the "official" app** for the public transport provider that you want to build a profile for.
|
||||||
2. **Configure a [man-in-the-middle HTTP proxy](https://docs.mitmproxy.org/stable/concepts-howmitmproxyworks/)** like [mitmproxy](https://mitmproxy.org).
|
2. **Configure a [man-in-the-middle HTTP proxy](https://docs.mitmproxy.org/stable/concepts-howmitmproxyworks/)** like [mitmproxy](https://mitmproxy.org).
|
||||||
- Configure your device to trust the self-signed SSL certificate, [as outlined in the mitmproxy docs](https://docs.mitmproxy.org/stable/concepts-certificates/).
|
- Configure your device to trust the self-signed SSL certificate, [as outlined in the mitmproxy docs](https://docs.mitmproxy.org/stable/concepts-certificates/).
|
||||||
- *Note*: This method does not work if the app uses [public key pinning](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning). In this case (the app won't be able to query data), please [create an issue](https://github.com/derhuerst/hafas-client/issues/new), so we can discuss other techniques.
|
- *Note*: This method does not work if the app uses [public key pinning](https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning). In this case (the app won't be able to query data), please [create an issue](https://github.com/public-transport/hafas-client/issues/new), so we can discuss other techniques.
|
||||||
3. **Record requests of the app.**
|
3. **Record requests of the app.**
|
||||||
- [There's a video showing this step](https://stuff.jannisr.de/how-to-record-hafas-requests.mp4).
|
- [There's a video showing this step](https://stuff.jannisr.de/how-to-record-hafas-requests.mp4).
|
||||||
- Make sure to cover all relevant sections of the app, e.g. "journeys", "departures", "live map". Better record more than less; You will regret not having enough information later on.
|
- Make sure to cover all relevant sections of the app, e.g. "journeys", "departures", "live map". Better record more than less; You will regret not having enough information later on.
|
||||||
|
@ -74,7 +74,7 @@ If you pass this profile into `hafas-client`, the `parseLine` method will overri
|
||||||
- **Identify the `locale`.** Basically guess work; Use the date & time formats as an indicator.
|
- **Identify the `locale`.** Basically guess work; Use the date & time formats as an indicator.
|
||||||
- **Identify the `timezone`.** This may be tricky, a for example [Deutsche Bahn](https://en.wikipedia.org/wiki/Deutsche_Bahn) returns departures for Moscow as `+01:00` instead of `+03:00`.
|
- **Identify the `timezone`.** This may be tricky, a for example [Deutsche Bahn](https://en.wikipedia.org/wiki/Deutsche_Bahn) returns departures for Moscow as `+01:00` instead of `+03:00`.
|
||||||
- **Copy the authentication** and other meta fields, namely `ver`, `ext`, `client` and `lang`.
|
- **Copy the authentication** and other meta fields, namely `ver`, `ext`, `client` and `lang`.
|
||||||
- You can find these fields in the root of each request JSON. Check [a VBB request](https://gist.github.com/derhuerst/5fa86ed5aec63645e5ae37e23e555886#file-1-http-L13-L22) and [the corresponding VBB profile](https://github.com/derhuerst/hafas-client/blob/6e61097687a37b60d53e767f2711466b80c5142c/p/vbb/index.js#L22-L29) for an example.
|
- You can find these fields in the root of each request JSON. Check [a VBB request](https://gist.github.com/derhuerst/5fa86ed5aec63645e5ae37e23e555886#file-1-http-L13-L22) and [the corresponding VBB profile](https://github.com/public-transport/hafas-client/blob/6e61097687a37b60d53e767f2711466b80c5142c/p/vbb/index.js#L22-L29) for an example.
|
||||||
- Add a function `transformReqBody(body)` to your profile, which assigns them to `body`.
|
- Add a function `transformReqBody(body)` to your profile, which assigns them to `body`.
|
||||||
- Some profiles have a `checksum` parameter (like [here](https://gist.github.com/derhuerst/2a735268bd82a0a6779633f15dceba33#file-journey-details-1-http-L1)) or two `mic` & `mac` parameters (like [here](https://gist.github.com/derhuerst/5fa86ed5aec63645e5ae37e23e555886#file-1-http-L1)). If you see one of them in your requests, jump to [*Appendix A: checksum, mic, mac*](#appendix-a-checksum-mic-mac). Unfortunately, this is necessary to get the profile working.
|
- Some profiles have a `checksum` parameter (like [here](https://gist.github.com/derhuerst/2a735268bd82a0a6779633f15dceba33#file-journey-details-1-http-L1)) or two `mic` & `mac` parameters (like [here](https://gist.github.com/derhuerst/5fa86ed5aec63645e5ae37e23e555886#file-1-http-L1)). If you see one of them in your requests, jump to [*Appendix A: checksum, mic, mac*](#appendix-a-checksum-mic-mac). Unfortunately, this is necessary to get the profile working.
|
||||||
|
|
||||||
|
@ -116,7 +116,7 @@ Let's break this down:
|
||||||
|
|
||||||
todo: `defaultProducts`, `allProducts`, `bitmasks`, add to profile
|
todo: `defaultProducts`, `allProducts`, `bitmasks`, add to profile
|
||||||
|
|
||||||
If you want, you can now **verify that the profile works**; We've prepared [a script](https://runkit.com/derhuerst/hafas-client-profile-example/0.1.0) for that. Alternatively, [submit a Pull Request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) and we will help you out with testing and improvements.
|
If you want, you can now **verify that the profile works**; We've prepared [a script](https://runkit.com/public-transport/hafas-client-profile-example/0.1.0) for that. Alternatively, [submit a Pull Request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) and we will help you out with testing and improvements.
|
||||||
|
|
||||||
### Finding the right values for the `bitmask` field
|
### Finding the right values for the `bitmask` field
|
||||||
|
|
||||||
|
@ -157,10 +157,10 @@ You can just query these, as long as you send a formally correct request.
|
||||||
|
|
||||||
### endpoints using the `checksum` query parameter
|
### endpoints using the `checksum` query parameter
|
||||||
|
|
||||||
`checksum` is a [message authentication code](https://en.wikipedia.org/wiki/Message_authentication_code): `hafas-client` will compute it by [hashing](https://en.wikipedia.org/wiki/Hash_function) the request body and a secret *salt*. **This secret can be read from the config file inside the app bundle.** There is no guide for this yet, so please [open an issue](https://github.com/derhuerst/hafas-client/issues/new) instead.
|
`checksum` is a [message authentication code](https://en.wikipedia.org/wiki/Message_authentication_code): `hafas-client` will compute it by [hashing](https://en.wikipedia.org/wiki/Hash_function) the request body and a secret *salt*. **This secret can be read from the config file inside the app bundle.** There is no guide for this yet, so please [open an issue](https://github.com/public-transport/hafas-client/issues/new) instead.
|
||||||
|
|
||||||
### endpoints using the `mic` & `mac` query parameters
|
### endpoints using the `mic` & `mac` query parameters
|
||||||
|
|
||||||
`mic` is a [message integrity code](https://en.wikipedia.org/wiki/Message_authentication_code), the [hash](https://en.wikipedia.org/wiki/Hash_function) of the request body.
|
`mic` is a [message integrity code](https://en.wikipedia.org/wiki/Message_authentication_code), the [hash](https://en.wikipedia.org/wiki/Hash_function) of the request body.
|
||||||
|
|
||||||
`mac` is a [message authentication code](https://en.wikipedia.org/wiki/Message_authentication_code), the hash of `mic` and a secret *salt*. **This secret can be read from the config file inside the app bundle.** There is no guide for this yet, so please [open an issue](https://github.com/derhuerst/hafas-client/issues/new) instead.
|
`mac` is a [message authentication code](https://en.wikipedia.org/wiki/Message_authentication_code), the hash of `mic` and a secret *salt*. **This secret can be read from the config file inside the app bundle.** There is no guide for this yet, so please [open an issue](https://github.com/public-transport/hafas-client/issues/new) instead.
|
||||||
|
|
2
index.js
2
index.js
|
@ -105,7 +105,7 @@ const createClient = (profile, request = _request) => {
|
||||||
// `CGI_READ_FAILED` if you pass `numF`, the parameter for the number
|
// `CGI_READ_FAILED` if you pass `numF`, the parameter for the number
|
||||||
// of results. To circumvent this, we loop here, collecting journeys
|
// of results. To circumvent this, we loop here, collecting journeys
|
||||||
// until we have enough.
|
// until we have enough.
|
||||||
// see https://github.com/derhuerst/hafas-client/pull/23#issuecomment-370246163
|
// see https://github.com/public-transport/hafas-client/pull/23#issuecomment-370246163
|
||||||
// todo: check if `numF` is supported again, revert this change
|
// todo: check if `numF` is supported again, revert this change
|
||||||
const journeys = []
|
const journeys = []
|
||||||
const more = (when, journeysRef) => {
|
const more = (when, journeysRef) => {
|
||||||
|
|
|
@ -20,7 +20,7 @@ const request = (profile, data) => {
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Accept-Encoding': 'gzip, deflate',
|
'Accept-Encoding': 'gzip, deflate',
|
||||||
'user-agent': 'https://github.com/derhuerst/hafas-client'
|
'user-agent': 'https://github.com/public-transport/hafas-client'
|
||||||
},
|
},
|
||||||
query: {}
|
query: {}
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
"contributors": [
|
"contributors": [
|
||||||
"Julius Tens <mail@juliustens.eu>"
|
"Julius Tens <mail@juliustens.eu>"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/derhuerst/hafas-client",
|
"homepage": "https://github.com/public-transport/hafas-client",
|
||||||
"repository": "derhuerst/hafas-client",
|
"repository": "public-transport/hafas-client",
|
||||||
"bugs": "https://github.com/derhuerst/hafas-client/issues",
|
"bugs": "https://github.com/public-transport/hafas-client/issues",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"hafas",
|
"hafas",
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
// todos from derhuerst/hafas-client#2
|
// todos from public-transport/hafas-client#2
|
||||||
// - stdStop.dPlatfS, stdStop.dPlatfR
|
// - stdStop.dPlatfS, stdStop.dPlatfR
|
||||||
// todo: what is d.jny.dirFlg?
|
// todo: what is d.jny.dirFlg?
|
||||||
// todo: d.stbStop.dProgType
|
// todo: d.stbStop.dProgType
|
||||||
// todo: d.freq, d.freq.jnyL, see https://github.com/derhuerst/hafas-client/blob/9203ed1481f08baacca41ac5e3c19bf022f01b0b/parse.js#L115
|
// todo: d.freq, d.freq.jnyL, see https://github.com/public-transport/hafas-client/blob/9203ed1481f08baacca41ac5e3c19bf022f01b0b/parse.js#L115
|
||||||
|
|
||||||
const createParseDeparture = (profile, stations, lines, remarks) => {
|
const createParseDeparture = (profile, stations, lines, remarks) => {
|
||||||
const findRemark = rm => remarks[parseInt(rm.remX)] || null
|
const findRemark = rm => remarks[parseInt(rm.remX)] || null
|
||||||
|
|
|
@ -11,8 +11,8 @@ HAFAS endpoint | wrapper library | docs | example code | source code
|
||||||
[Nahverkehrsverbund Schleswig-Holstein (NAH.SH)](https://de.wikipedia.org/wiki/Nahverkehrsverbund_Schleswig-Holstein) | [`nahsh-hafas`](https://github.com/juliuste/nahsh-hafas) | [docs](p/nahsh/readme.md) | [example code](p/nahsh/example.js) | [src](p/nahsh/index.js)
|
[Nahverkehrsverbund Schleswig-Holstein (NAH.SH)](https://de.wikipedia.org/wiki/Nahverkehrsverbund_Schleswig-Holstein) | [`nahsh-hafas`](https://github.com/juliuste/nahsh-hafas) | [docs](p/nahsh/readme.md) | [example code](p/nahsh/example.js) | [src](p/nahsh/index.js)
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/hafas-client)
|
[](https://www.npmjs.com/package/hafas-client)
|
||||||
[](https://travis-ci.org/derhuerst/hafas-client)
|
[](https://travis-ci.org/public-transport/hafas-client)
|
||||||

|

|
||||||
[](https://gitter.im/derhuerst)
|
[](https://gitter.im/derhuerst)
|
||||||
[](https://patreon.com/derhuerst)
|
[](https://patreon.com/derhuerst)
|
||||||
|
|
||||||
|
@ -181,4 +181,4 @@ The returned [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
If you **have a question**, **found a bug** or want to **propose a feature**, have a look at [the issues page](https://github.com/derhuerst/hafas-client/issues).
|
If you **have a question**, **found a bug** or want to **propose a feature**, have a look at [the issues page](https://github.com/public-transport/hafas-client/issues).
|
||||||
|
|
|
@ -95,7 +95,7 @@ const assertValidPrice = (t, p) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: fix this upstream
|
// todo: fix this upstream
|
||||||
// see https://github.com/derhuerst/hafas-client/blob/c6e558be217667f1bcdac4a605898eb75ea80374/p/oebb/products.js#L71
|
// see https://github.com/public-transport/hafas-client/blob/c6e558be217667f1bcdac4a605898eb75ea80374/p/oebb/products.js#L71
|
||||||
const assertValidLine = (t, l) => { // with optional mode
|
const assertValidLine = (t, l) => { // with optional mode
|
||||||
const validators = Object.assign({}, validateFptf.defaultValidators, {
|
const validators = Object.assign({}, validateFptf.defaultValidators, {
|
||||||
line: validateLineWithoutMode
|
line: validateLineWithoutMode
|
||||||
|
|
|
@ -19,7 +19,7 @@ const validateLineWithoutMode = (validate, line, name) => {
|
||||||
a.ok(line.name.length > 0, name + '.name can\'t be empty')
|
a.ok(line.name.length > 0, name + '.name can\'t be empty')
|
||||||
|
|
||||||
// skipping line validation here
|
// skipping line validation here
|
||||||
// see https://github.com/derhuerst/hafas-client/issues/8#issuecomment-355839965
|
// see https://github.com/public-transport/hafas-client/issues/8#issuecomment-355839965
|
||||||
if (is.undefined(line.mode) || is.null(line.mode)) {
|
if (is.undefined(line.mode) || is.null(line.mode)) {
|
||||||
console.error(`ÖBB: Missing \`mode\` for line ${line.name} (at ${name}).`)
|
console.error(`ÖBB: Missing \`mode\` for line ${line.name} (at ${name}).`)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue