Comments (6)
Hi @mcondren,
I would love to add that feature but I might need your help as my accounts haven't had that feature enabled yet.
Let me know if you're interesting in helping out.
- Andrew Pearson
from southern-company-api.
I've done a bit of digging on this topic @apearson, I was able to get this call working in Postman thanks to your description of how the auth worked. Most of the interesting information lives in the data object (for some reason they stringified the JSON...?). The API maps very closely to the graph that Georgia Power displays. The Y axis for the cost data represents dollars, and the Y axis for the usage data represents kWh.
The API for hourly data is:
https://customerservice2api.southerncompany.com/api/MyPowerUsage/MPUData/<ACCOUNT_ID>/Hourly?EndDate=01%2F27%2F2022&OPCO=GPC&ServicePointNumber=<METER_ID?>&StartDate=01%2F26%2F2022&intervalBehavior=Automatic
And the response object looks like:
{
"StatusCode": 200,
"Message": "Successfully retrieved My Power Usage data for Hourly Graph",
"MessageType": 0,
"Data": {
"contractriderDesc": null,
"Data": "{\"xAxis\":{\"labels\":[\"2022-01-26T00:00:00\",\"2022-01-26T01:00:00\",\"2022-01-26T02:00:00\",\"2022-01-26T03:00:00\",\"2022-01-26T04:00:00\",\"2022-01-26T05:00:00\",\"2022-01-26T06:00:00\",\"2022-01-26T07:00:00\",\"2022-01-26T08:00:00\",\"2022-01-26T09:00:00\",\"2022-01-26T10:00:00\",\"2022-01-26T11:00:00\",\"2022-01-26T12:00:00\",\"2022-01-26T13:00:00\",\"2022-01-26T14:00:00\",\"2022-01-26T15:00:00\",\"2022-01-26T16:00:00\",\"2022-01-26T17:00:00\",\"2022-01-26T18:00:00\",\"2022-01-26T19:00:00\",\"2022-01-26T20:00:00\",\"2022-01-26T21:00:00\",\"2022-01-26T22:00:00\",\"2022-01-26T23:00:00\"]},\"series\":{\"cost\":{\"data\":[{\"x\":0,\"y\":0.0,\"name\":\"2022-01-26T00:00:00\",\"resolution\":\"hourly\"},{\"x\":1,\"y\":0.0,\"name\":\"2022-01-26T01:00:00\",\"resolution\":\"hourly\"},{\"x\":2,\"y\":0.13,\"name\":\"2022-01-26T02:00:00\",\"resolution\":\"hourly\"},{\"x\":3,\"y\":0.13,\"name\":\"2022-01-26T03:00:00\",\"resolution\":\"hourly\"},{\"x\":4,\"y\":0.13,\"name\":\"2022-01-26T04:00:00\",\"resolution\":\"hourly\"},{\"x\":5,\"y\":0.0,\"name\":\"2022-01-26T05:00:00\",\"resolution\":\"hourly\"},{\"x\":6,\"y\":0.13,\"name\":\"2022-01-26T06:00:00\",\"resolution\":\"hourly\"},{\"x\":7,\"y\":0.13,\"name\":\"2022-01-26T07:00:00\",\"resolution\":\"hourly\"},{\"x\":8,\"y\":0.13,\"name\":\"2022-01-26T08:00:00\",\"resolution\":\"hourly\"},{\"x\":9,\"y\":0.13,\"name\":\"2022-01-26T09:00:00\",\"resolution\":\"hourly\"},{\"x\":10,\"y\":0.13,\"name\":\"2022-01-26T10:00:00\",\"resolution\":\"hourly\"},{\"x\":11,\"y\":0.39,\"name\":\"2022-01-26T11:00:00\",\"resolution\":\"hourly\"},{\"x\":12,\"y\":0.13,\"name\":\"2022-01-26T12:00:00\",\"resolution\":\"hourly\"},{\"x\":13,\"y\":0.13,\"name\":\"2022-01-26T13:00:00\",\"resolution\":\"hourly\"},{\"x\":14,\"y\":0.0,\"name\":\"2022-01-26T14:00:00\",\"resolution\":\"hourly\"},{\"x\":15,\"y\":0.26,\"name\":\"2022-01-26T15:00:00\",\"resolution\":\"hourly\"},{\"x\":16,\"y\":0.0,\"name\":\"2022-01-26T16:00:00\",\"resolution\":\"hourly\"},{\"x\":17,\"y\":0.52,\"name\":\"2022-01-26T17:00:00\",\"resolution\":\"hourly\"},{\"x\":18,\"y\":0.26,\"name\":\"2022-01-26T18:00:00\",\"resolution\":\"hourly\"},{\"x\":19,\"y\":0.13,\"name\":\"2022-01-26T19:00:00\",\"resolution\":\"hourly\"},{\"x\":20,\"y\":0.13,\"name\":\"2022-01-26T20:00:00\",\"resolution\":\"hourly\"},{\"x\":21,\"y\":0.0,\"name\":\"2022-01-26T21:00:00\",\"resolution\":\"hourly\"},{\"x\":22,\"y\":0.13,\"name\":\"2022-01-26T22:00:00\",\"resolution\":\"hourly\"},{\"x\":23,\"y\":0.13,\"name\":\"2022-01-26T23:00:00\",\"resolution\":\"hourly\"}]},\"usage\":{\"data\":[{\"x\":0,\"y\":0.0,\"name\":\"2022-01-26T00:00:00\",\"resolution\":\"hourly\"},{\"x\":1,\"y\":0.0,\"name\":\"2022-01-26T01:00:00\",\"resolution\":\"hourly\"},{\"x\":2,\"y\":1.0,\"name\":\"2022-01-26T02:00:00\",\"resolution\":\"hourly\"},{\"x\":3,\"y\":1.0,\"name\":\"2022-01-26T03:00:00\",\"resolution\":\"hourly\"},{\"x\":4,\"y\":1.0,\"name\":\"2022-01-26T04:00:00\",\"resolution\":\"hourly\"},{\"x\":5,\"y\":0.0,\"name\":\"2022-01-26T05:00:00\",\"resolution\":\"hourly\"},{\"x\":6,\"y\":1.0,\"name\":\"2022-01-26T06:00:00\",\"resolution\":\"hourly\"},{\"x\":7,\"y\":1.0,\"name\":\"2022-01-26T07:00:00\",\"resolution\":\"hourly\"},{\"x\":8,\"y\":1.0,\"name\":\"2022-01-26T08:00:00\",\"resolution\":\"hourly\"},{\"x\":9,\"y\":1.0,\"name\":\"2022-01-26T09:00:00\",\"resolution\":\"hourly\"},{\"x\":10,\"y\":1.0,\"name\":\"2022-01-26T10:00:00\",\"resolution\":\"hourly\"},{\"x\":11,\"y\":3.0,\"name\":\"2022-01-26T11:00:00\",\"resolution\":\"hourly\"},{\"x\":12,\"y\":1.0,\"name\":\"2022-01-26T12:00:00\",\"resolution\":\"hourly\"},{\"x\":13,\"y\":1.0,\"name\":\"2022-01-26T13:00:00\",\"resolution\":\"hourly\"},{\"x\":14,\"y\":0.0,\"name\":\"2022-01-26T14:00:00\",\"resolution\":\"hourly\"},{\"x\":15,\"y\":2.0,\"name\":\"2022-01-26T15:00:00\",\"resolution\":\"hourly\"},{\"x\":16,\"y\":0.0,\"name\":\"2022-01-26T16:00:00\",\"resolution\":\"hourly\"},{\"x\":17,\"y\":4.0,\"name\":\"2022-01-26T17:00:00\",\"resolution\":\"hourly\"},{\"x\":18,\"y\":2.0,\"name\":\"2022-01-26T18:00:00\",\"resolution\":\"hourly\"},{\"x\":19,\"y\":1.0,\"name\":\"2022-01-26T19:00:00\",\"resolution\":\"hourly\"},{\"x\":20,\"y\":1.0,\"name\":\"2022-01-26T20:00:00\",\"resolution\":\"hourly\"},{\"x\":21,\"y\":0.0,\"name\":\"2022-01-26T21:00:00\",\"resolution\":\"hourly\"},{\"x\":22,\"y\":1.0,\"name\":\"2022-01-26T22:00:00\",\"resolution\":\"hourly\"},{\"x\":23,\"y\":1.0,\"name\":\"2022-01-26T23:00:00\",\"resolution\":\"hourly\"}]},\"costDelayed\":{\"data\":[]},\"usageDelayed\":{\"data\":[]},\"temp\":{\"data\":[{\"x\":0,\"y\":40.0,\"name\":\"2022-01-26T00:00:00\",\"resolution\":\"hourly\"},{\"x\":1,\"y\":38.0,\"name\":\"2022-01-26T01:00:00\",\"resolution\":\"hourly\"},{\"x\":2,\"y\":36.0,\"name\":\"2022-01-26T02:00:00\",\"resolution\":\"hourly\"},{\"x\":3,\"y\":34.0,\"name\":\"2022-01-26T03:00:00\",\"resolution\":\"hourly\"},{\"x\":4,\"y\":33.0,\"name\":\"2022-01-26T04:00:00\",\"resolution\":\"hourly\"},{\"x\":5,\"y\":32.0,\"name\":\"2022-01-26T05:00:00\",\"resolution\":\"hourly\"},{\"x\":6,\"y\":31.0,\"name\":\"2022-01-26T06:00:00\",\"resolution\":\"hourly\"},{\"x\":7,\"y\":31.0,\"name\":\"2022-01-26T07:00:00\",\"resolution\":\"hourly\"},{\"x\":8,\"y\":32.0,\"name\":\"2022-01-26T08:00:00\",\"resolution\":\"hourly\"},{\"x\":9,\"y\":37.0,\"name\":\"2022-01-26T09:00:00\",\"resolution\":\"hourly\"},{\"x\":10,\"y\":41.0,\"name\":\"2022-01-26T10:00:00\",\"resolution\":\"hourly\"},{\"x\":11,\"y\":45.0,\"name\":\"2022-01-26T11:00:00\",\"resolution\":\"hourly\"},{\"x\":12,\"y\":49.0,\"name\":\"2022-01-26T12:00:00\",\"resolution\":\"hourly\"},{\"x\":13,\"y\":50.0,\"name\":\"2022-01-26T13:00:00\",\"resolution\":\"hourly\"},{\"x\":14,\"y\":51.0,\"name\":\"2022-01-26T14:00:00\",\"resolution\":\"hourly\"},{\"x\":15,\"y\":51.0,\"name\":\"2022-01-26T15:00:00\",\"resolution\":\"hourly\"},{\"x\":16,\"y\":49.0,\"name\":\"2022-01-26T16:00:00\",\"resolution\":\"hourly\"},{\"x\":17,\"y\":47.0,\"name\":\"2022-01-26T17:00:00\",\"resolution\":\"hourly\"},{\"x\":18,\"y\":44.0,\"name\":\"2022-01-26T18:00:00\",\"resolution\":\"hourly\"},{\"x\":19,\"y\":41.0,\"name\":\"2022-01-26T19:00:00\",\"resolution\":\"hourly\"},{\"x\":20,\"y\":39.0,\"name\":\"2022-01-26T20:00:00\",\"resolution\":\"hourly\"},{\"x\":21,\"y\":37.0,\"name\":\"2022-01-26T21:00:00\",\"resolution\":\"hourly\"},{\"x\":22,\"y\":36.0,\"name\":\"2022-01-26T22:00:00\",\"resolution\":\"hourly\"},{\"x\":23,\"y\":35.0,\"name\":\"2022-01-26T23:00:00\",\"resolution\":\"hourly\"}]}}}",
"HighTempIndex": -1,
"LowTempIndex": -1,
"TemperatureIndex": -1,
"NotificationIndex": -1,
"AboveAlertIndex": -1,
"DailyAlertIndex": -1,
"WeekendIndex": -1,
"ReminderIndex": -1,
"ProjectedBillAmountHigh": null,
"ProjectedBillAmountLow": null,
"AverageDailyCost": null,
"Days": 0.0,
"DollarsToDate": null,
"TotalkWhUsed": 0.0,
"HasData": true,
"HasEstimatedBill": false,
"IsPartialMonth": false,
"RemainingDays": 0,
"DaysToDate": 0,
"AlertThreshold": 0,
"AlertThresholdExceeded": false,
"UsageTable": null
},
"ModelErrors": [],
"IsScApiResult": true
}
The data object in the middle is prettified as:
{
"xAxis": {
"labels": [
"2022-01-26T00:00:00",
"2022-01-26T01:00:00",
"2022-01-26T02:00:00",
"2022-01-26T03:00:00",
"2022-01-26T04:00:00",
"2022-01-26T05:00:00",
"2022-01-26T06:00:00",
"2022-01-26T07:00:00",
"2022-01-26T08:00:00",
"2022-01-26T09:00:00",
"2022-01-26T10:00:00",
"2022-01-26T11:00:00",
"2022-01-26T12:00:00",
"2022-01-26T13:00:00",
"2022-01-26T14:00:00",
"2022-01-26T15:00:00",
"2022-01-26T16:00:00",
"2022-01-26T17:00:00",
"2022-01-26T18:00:00",
"2022-01-26T19:00:00",
"2022-01-26T20:00:00",
"2022-01-26T21:00:00",
"2022-01-26T22:00:00",
"2022-01-26T23:00:00"
]
},
"series": {
"cost": {
"data": [
{
"x": 0,
"y": 0.0,
"name": "2022-01-26T00:00:00",
"resolution": "hourly"
},
{
"x": 1,
"y": 0.0,
"name": "2022-01-26T01:00:00",
"resolution": "hourly"
},
{
"x": 2,
"y": 0.13,
"name": "2022-01-26T02:00:00",
"resolution": "hourly"
},
{
"x": 3,
"y": 0.13,
"name": "2022-01-26T03:00:00",
"resolution": "hourly"
},
{
"x": 4,
"y": 0.13,
"name": "2022-01-26T04:00:00",
"resolution": "hourly"
},
{
"x": 5,
"y": 0.0,
"name": "2022-01-26T05:00:00",
"resolution": "hourly"
},
{
"x": 6,
"y": 0.13,
"name": "2022-01-26T06:00:00",
"resolution": "hourly"
},
{
"x": 7,
"y": 0.13,
"name": "2022-01-26T07:00:00",
"resolution": "hourly"
},
{
"x": 8,
"y": 0.13,
"name": "2022-01-26T08:00:00",
"resolution": "hourly"
},
{
"x": 9,
"y": 0.13,
"name": "2022-01-26T09:00:00",
"resolution": "hourly"
},
{
"x": 10,
"y": 0.13,
"name": "2022-01-26T10:00:00",
"resolution": "hourly"
},
{
"x": 11,
"y": 0.39,
"name": "2022-01-26T11:00:00",
"resolution": "hourly"
},
{
"x": 12,
"y": 0.13,
"name": "2022-01-26T12:00:00",
"resolution": "hourly"
},
{
"x": 13,
"y": 0.13,
"name": "2022-01-26T13:00:00",
"resolution": "hourly"
},
{
"x": 14,
"y": 0.0,
"name": "2022-01-26T14:00:00",
"resolution": "hourly"
},
{
"x": 15,
"y": 0.26,
"name": "2022-01-26T15:00:00",
"resolution": "hourly"
},
{
"x": 16,
"y": 0.0,
"name": "2022-01-26T16:00:00",
"resolution": "hourly"
},
{
"x": 17,
"y": 0.52,
"name": "2022-01-26T17:00:00",
"resolution": "hourly"
},
{
"x": 18,
"y": 0.26,
"name": "2022-01-26T18:00:00",
"resolution": "hourly"
},
{
"x": 19,
"y": 0.13,
"name": "2022-01-26T19:00:00",
"resolution": "hourly"
},
{
"x": 20,
"y": 0.13,
"name": "2022-01-26T20:00:00",
"resolution": "hourly"
},
{
"x": 21,
"y": 0.0,
"name": "2022-01-26T21:00:00",
"resolution": "hourly"
},
{
"x": 22,
"y": 0.13,
"name": "2022-01-26T22:00:00",
"resolution": "hourly"
},
{
"x": 23,
"y": 0.13,
"name": "2022-01-26T23:00:00",
"resolution": "hourly"
}
]
},
"usage": {
"data": [
{
"x": 0,
"y": 0.0,
"name": "2022-01-26T00:00:00",
"resolution": "hourly"
},
{
"x": 1,
"y": 0.0,
"name": "2022-01-26T01:00:00",
"resolution": "hourly"
},
{
"x": 2,
"y": 1.0,
"name": "2022-01-26T02:00:00",
"resolution": "hourly"
},
{
"x": 3,
"y": 1.0,
"name": "2022-01-26T03:00:00",
"resolution": "hourly"
},
{
"x": 4,
"y": 1.0,
"name": "2022-01-26T04:00:00",
"resolution": "hourly"
},
{
"x": 5,
"y": 0.0,
"name": "2022-01-26T05:00:00",
"resolution": "hourly"
},
{
"x": 6,
"y": 1.0,
"name": "2022-01-26T06:00:00",
"resolution": "hourly"
},
{
"x": 7,
"y": 1.0,
"name": "2022-01-26T07:00:00",
"resolution": "hourly"
},
{
"x": 8,
"y": 1.0,
"name": "2022-01-26T08:00:00",
"resolution": "hourly"
},
{
"x": 9,
"y": 1.0,
"name": "2022-01-26T09:00:00",
"resolution": "hourly"
},
{
"x": 10,
"y": 1.0,
"name": "2022-01-26T10:00:00",
"resolution": "hourly"
},
{
"x": 11,
"y": 3.0,
"name": "2022-01-26T11:00:00",
"resolution": "hourly"
},
{
"x": 12,
"y": 1.0,
"name": "2022-01-26T12:00:00",
"resolution": "hourly"
},
{
"x": 13,
"y": 1.0,
"name": "2022-01-26T13:00:00",
"resolution": "hourly"
},
{
"x": 14,
"y": 0.0,
"name": "2022-01-26T14:00:00",
"resolution": "hourly"
},
{
"x": 15,
"y": 2.0,
"name": "2022-01-26T15:00:00",
"resolution": "hourly"
},
{
"x": 16,
"y": 0.0,
"name": "2022-01-26T16:00:00",
"resolution": "hourly"
},
{
"x": 17,
"y": 4.0,
"name": "2022-01-26T17:00:00",
"resolution": "hourly"
},
{
"x": 18,
"y": 2.0,
"name": "2022-01-26T18:00:00",
"resolution": "hourly"
},
{
"x": 19,
"y": 1.0,
"name": "2022-01-26T19:00:00",
"resolution": "hourly"
},
{
"x": 20,
"y": 1.0,
"name": "2022-01-26T20:00:00",
"resolution": "hourly"
},
{
"x": 21,
"y": 0.0,
"name": "2022-01-26T21:00:00",
"resolution": "hourly"
},
{
"x": 22,
"y": 1.0,
"name": "2022-01-26T22:00:00",
"resolution": "hourly"
},
{
"x": 23,
"y": 1.0,
"name": "2022-01-26T23:00:00",
"resolution": "hourly"
}
]
},
"costDelayed": {
"data": []
},
"usageDelayed": {
"data": []
},
"temp": {
"data": [
{
"x": 0,
"y": 40.0,
"name": "2022-01-26T00:00:00",
"resolution": "hourly"
},
{
"x": 1,
"y": 38.0,
"name": "2022-01-26T01:00:00",
"resolution": "hourly"
},
{
"x": 2,
"y": 36.0,
"name": "2022-01-26T02:00:00",
"resolution": "hourly"
},
{
"x": 3,
"y": 34.0,
"name": "2022-01-26T03:00:00",
"resolution": "hourly"
},
{
"x": 4,
"y": 33.0,
"name": "2022-01-26T04:00:00",
"resolution": "hourly"
},
{
"x": 5,
"y": 32.0,
"name": "2022-01-26T05:00:00",
"resolution": "hourly"
},
{
"x": 6,
"y": 31.0,
"name": "2022-01-26T06:00:00",
"resolution": "hourly"
},
{
"x": 7,
"y": 31.0,
"name": "2022-01-26T07:00:00",
"resolution": "hourly"
},
{
"x": 8,
"y": 32.0,
"name": "2022-01-26T08:00:00",
"resolution": "hourly"
},
{
"x": 9,
"y": 37.0,
"name": "2022-01-26T09:00:00",
"resolution": "hourly"
},
{
"x": 10,
"y": 41.0,
"name": "2022-01-26T10:00:00",
"resolution": "hourly"
},
{
"x": 11,
"y": 45.0,
"name": "2022-01-26T11:00:00",
"resolution": "hourly"
},
{
"x": 12,
"y": 49.0,
"name": "2022-01-26T12:00:00",
"resolution": "hourly"
},
{
"x": 13,
"y": 50.0,
"name": "2022-01-26T13:00:00",
"resolution": "hourly"
},
{
"x": 14,
"y": 51.0,
"name": "2022-01-26T14:00:00",
"resolution": "hourly"
},
{
"x": 15,
"y": 51.0,
"name": "2022-01-26T15:00:00",
"resolution": "hourly"
},
{
"x": 16,
"y": 49.0,
"name": "2022-01-26T16:00:00",
"resolution": "hourly"
},
{
"x": 17,
"y": 47.0,
"name": "2022-01-26T17:00:00",
"resolution": "hourly"
},
{
"x": 18,
"y": 44.0,
"name": "2022-01-26T18:00:00",
"resolution": "hourly"
},
{
"x": 19,
"y": 41.0,
"name": "2022-01-26T19:00:00",
"resolution": "hourly"
},
{
"x": 20,
"y": 39.0,
"name": "2022-01-26T20:00:00",
"resolution": "hourly"
},
{
"x": 21,
"y": 37.0,
"name": "2022-01-26T21:00:00",
"resolution": "hourly"
},
{
"x": 22,
"y": 36.0,
"name": "2022-01-26T22:00:00",
"resolution": "hourly"
},
{
"x": 23,
"y": 35.0,
"name": "2022-01-26T23:00:00",
"resolution": "hourly"
}
]
}
}
}
from southern-company-api.
Draft PR here #27 @apearson @mcondren
from southern-company-api.
Thanks for your work @alex-hall !
from southern-company-api.
Thanks for all the work and effort @alex-hall (thank you @mcondren for pointing it out). I'm going to take a look at the PR and see how we can get this integrated into the library. Might take me a couple of days or so but know I'm looking at it!
Yes, they stringify the json for some reason. I'm assuming it's being passed by an internal system and they aren't parsing before sending to the frontend.
from southern-company-api.
2.2.0 includes the changes in #27
Going to close for now but feel free to open back up and let me know if you run into any issues @alex-hall @mcondren
from southern-company-api.
Related Issues (20)
- Tests are not checking validity of data
- Want to switch to node-fetch HOT 1
- Delayed Reading fix HOT 1
- Check if ending date is included or excluded from daily data HOT 1
- obtaining ScJwtToken HOT 8
- Getting 404 on MonthlyGraph API call HOT 4
- API change after 7/8? Null data json HOT 1
- Will this still work with Gulf Power Company even though they were sold to another company? HOT 2
- Does this still work? HOT 10
- 🐛 TypeError: Cannot read properties of undefined (reading '1') HOT 1
- Volunteering to help with GA power testing HOT 2
- GA Power Testing HOT 5
- Hourly API for premium subscription HOT 4
- Auth mechanism changed? HOT 5
- Usage no longer takes "AccountNumber" HOT 5
- Dates last year take this year's year
- getMonthlyData does not work without budget billing HOT 1
- API returning back null data when last two days are requested HOT 3
- Move library to v1.0.0 HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from southern-company-api.