











































































npm i @wulkanowy/uonet-request-signer wyrzuca mi blad o braku pythona jak w plikach repo nie ma pojedynczej wzmianki o pythonie?
node-webcrypto-ossl, bo jest w zależnościach
































EfebSsoAuthCookie wystarczy do autentyfikacji?







https://cufs.vulcan.net.pl/{symbol}/Account/LogOn – wymaga podania identyfikatora określającego powiat w miejscu {symbol}, np. powiatjaroslawski - https://cufs.vulcan.net.pl/Default/Account/LogOn – un...
1















[unexpected] action required for ws-federation authentication service







curl -v














%2fpoznan%2fFS%2fLS%3fwa%3dwsignin1.0%26wtrealm%3...
?, dlatego jest zenkodowane















https://cufs.vulcan.net.pl/Default/Account/LogOn?ReturnUrl=%2FDefault%2FFS%2FLS%3Fwa%3Dwsignin1.0%26wtrealm%3Dhttps%253a%252f%252fuonetplus.vulcan.net.pl%252fDefault%252fLoginEndpoint.aspx%26wctx%3Dhttps%253a%252f%252fuonetplus.vulcan.net.pl%252fDefault%252fLoginEndpoint.aspxDefault, a przedostatni tym, na którego logował się wcześniej użytkownik)https://uonetplus.vulcan.net.pl/{symbol}/LoginEndpoint.aspx gdzie {symbol} to któryś z wybranych symboli








cheerio


document.getElementById()

public $: CheerioStatic;
public constructor(html: string) {
this.$ = cheerio.load(html);
}
public getDayNames(): string[] {
return this.$('.tabela tr:first-of-type th').toArray()
.map((element: CheerioElement): string => this.$(element).text())
.slice(2);
}















wresult


Default i symbol? (edited)




Default



x-www-form-urlencoded bo mi zwraca <html><head><title>Object moved</title></head><body>\r\n<h2>Object moved to <a href="/Default/FS/LS?wa=wsignin1.0&wtrealm=https%3a%2f%2fuonetplus.vulcan.net.pl%2fDefault%2fLoginEndpoint.aspx&wctx=https%3a%2f%2fuonetplus.vulcan.net.pl%2fDefault%2fLoginEndpoint.aspx">here</a>.</h2>\r\n</body></html>\r\n


























wa: wsignin1.0 wklepać na stało czy wyciagać to z innego requesta (edited)




GitHub 






axios jest spoko




GitHub 

GitHub 

GitHub 






"/$symbol/FS/LS?wa=wsignin1.0&wtrealm=${encode($schema://uonetplus.$host/$symbol/LoginEndpoint.aspx)}&wctx${encode($schema://uonetplus.$host/$symbol/LoginEndpoint.aspx)}" (edited)


























GitHub 


























const wulkanowy = require('./js-api/dist/index.js');
const client = new wulkanowy.Client();
client.login('email', "hasło", "vulcan.net.pl").then(r => {
console.log(client.symbol)
}).catch(console.error)










sdk-js?sdk-node

git@github.com:wulkanowy/sdk-node.git
GitHub 



[AttributeName$="UserInstance"] a [AttributeName$=\"Instance\"] samlAttributeValue









npm i git+https://github.com/wulkanowy/sdk-node



: w dokumencie na ``, czyli je usunąłem







"@types/cheerio": "^0.22.17",

const symbols: string[] = x('[AttributeName$="UserInstance"] saml\\:AttributeValue').map((i) => x(this).text());?




const symbols: string[] = x('[AttributeName$="UserInstance"] saml\\:AttributeValue').map((i) => x(this).text());
to do symbols przypisze sie nie x(this).text() tylko całe x('[AttributeName$="UserInstance"] saml\\:AttributeValue').map((i) => x(this).text())















timetable.cache i timetable.fetch()
2️⃣ getTimetable()










...



responses wygląda tak:
[
{*objekt z cheerio*
data: {
data: [
{
user1 (tu ma byc url)
},
{
user2 (tu ma byc url)
},
],
success: true
}
},
{*objekt z cheerio*
data: {
data: [
{
user1 (tu ma byc url)
},
{
user2 (tu ma byc url)
},
],
success: true
}
},
{*objekt z cheerio*
data: {
data: [
{
user1 (tu ma byc url)
},
{
user2 (tu ma byc url)
},
],
success: true
}
}
]


























<div>
<span class=" x-treelabel-inv">Tworzenie i administrowanie bazami danych [zaw2]</span>
<span class=" x-treelabel-inv"></span>
<span class=" x-treelabel-inv">Dębicki Robert</span>
<span class=" x-treelabel-inv">34</span>
<span class="x-treelabel-ppl x-treelabel-zas">Tworzenie i administrowanie bazami danych [zaw2]</span>
<span class="x-treelabel-ppl x-treelabel-zas"></span>
<span class="x-treelabel-ppl x-treelabel-zas">Kobyliński Leszek</span>
<span class="x-treelabel-ppl x-treelabel-zas">34</span>
<span class="x-treelabel-rlz">(zastępstwo)</span>
</div>
<div>
<span class="">Tworzenie aplikacji internetowych [zaw2]</span>
<span class=""></span>
<span class=""></span>
<span class=""></span>
</div>






























(edited)


@wulkanowy/sdk
GitHub 




1










qr-node (edited)











"global-require": "off"























































GitHub 















































?. nie działa

?. nie działa










__test__ unity żeby dało się to jakoś sprawdzać 

e2e jak robi to np. angular
/__tests__?
dir/
file.js
file.test.jstest w rootcie projektu
dir
- __test__
- plik.ts
- plik.ts
e2e
- plik.ts



@types/jest masz?


jest (edited)
describe ma być ;-D





test w package.json

lint:test?





lint oraz test


"eslint": "eslint src/**.ts"










eslint -c .eslintrc.json --ext .ts src/**
/__tests__


e2e a do tego unity możemy pisać w folderach __test__ albo tak jak z tego artykułu



__test__ znajduje się w tym samym co dany testowny plik

root/
| - tests
| | - client.e2e.ts
| - src
| | - client
| | | - __tests___
| | | | - client.unit.ts
| | | - client.ts (edited)


__tests__ zamiast __test___


tests? Bo defaultowo wykrywa tylko __tests__ (edited)
package.json file of your project, or through a jest.config.js file or through the --config option. If you'd like to use your package.json to store Jest's config, the "jest" key should be used on the top level so Jest will ...
(/__tests__|tests/.*|(\\.|/)(test|spec))\\.[jt]sx?$?

["(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$", "(/tests/.*|(\\.|/)(test|spec))\\.[jt]sx?$]"]







./ (edited)








[editLesson.subject] = this.getLessonAndGroupInfoFromSpan(cośtam); (edited)























return {
...lesson,
subject: ...
}




























this.getLessonInfo(lesson, divs.eq(0).html()
const lesson = this.getLessonInfo(lesson, divs.eq(0).html()
.
.
.
info: [duzo kodu nie chce mi się pisać](lesson.info)), [podobnie](lesson.subject)





















































package-lock przydaje





















.pop() chcesz




















new Date(2020, 2, 26)2020-03-25T23:00:00.000Z




> new Date(Date.UTC(2020, 2, 26))
2020-03-26T00:00:00.000Z
2020-03-25T23:00:00.000Z






""



""
studentPlan to PlanUcznia?










undefined byłby najlepszą opcją ponieważ tego parametru wtedy tak jakby nie deklarujemy a domyślnym zwrotem z zapytania o parametr nie zadeklarowany jest undefined lub jeśli chcesz zachować coś nie jako optional ze względów wygody danych przychodzących z api to '' ale dla mnie to obojętne, byle żeby nie był to null bo wtedy w typach robi się rozwałka w wypadku jak włączysz rozróżnienie bo ? domyślnie daje undefined a jak chcesz nulla to musisz pisać string | null 













login(mode)
/src
| - scrapper
| - hybrid
| - mobile
| - sheared
| - index.ts // tu export * from ...
Tak no ważne żeby import nie wchodzi w niepotrzebne pliki bo np. z danej klasy potrzeba konkretnej funkcji






drugie imięundefinednullnull oznacza, że wiemy, że wartość nie istniejeundefined, że nie znamy wartości




undefined, ale można w bazie ustawić tak aby data().nullPole zwracało null


nullem a undefindem jest typeof który może czasem przejść przez assertion 
!value i value === null zamiennie
value === undefined i wejdzie null typeof object i nie chcesz żeby jak jest puste weszło i użyjesz null (edited)


() => {}
console.log(["10", "10", "10"].map(parseInt)); (edited)






















startOfWeek


import * as wulkanowy from '../src';
const client = new wulkanowy.Client('fakelog.cf');
describe('Client', () => {
describe('Login method', () => {
it('Login to fakelog account', () => expect(
client.login('jan@fakelog.cf', 'jan123'),
).resolves.toEqual('powiatwulkanowy'));
it('Throws error if login credentials are invalid', () => expect(
client.login('jan@fakelog.cf', 'invalid-password'),
).rejects.toHaveProperty('name', 'InvalidCredentialsError'));
});
}); (edited)








let client;
.
.
.
beforeEach(() => {
client = new wulkanowy.Client('fakelog.cf');
});




























kebab-case (nawet dla klas)





Register

gradebook a register







return true?














homework.date














GitHub
GitHub
GitHub 













GitHub 

GitHub 








husky 

as bo nie możemy tego teraz zostawić bo potem nikt tego nie posprząta 
as wyrzuci błąd jak się typ nie będzie zgadzał?







GitHub 


GitHub 





GitHub 










object



GitHub 
















GitHub 






























GitHub 

















GitHub 


































{
"extends": "./tsconfig.json",
"include": [
"tests"
]
} (edited) {
"files": [
"tests/**"
],
"parserOptions": {
"project": "./tsconfig.tests.json"
}
},































let a = {
x: 5
y: 6
}
b = a
b.x = 10
console.log(a.x) // 10
a.y = 12
console.log(b.y) // 12 (edited)weekDays = htmlResponse.Headers.slice(1)

















GitHub 

new URL('UczenDziennik.mvc/Get', studentUrl).toString(); dla studentUrl "http://uonetplus-uczen.fakelog.cf/powiatwulkanowy/123456/" wychodzi coś takiego:
"http://uonetplus-uczen.fakelog.cf/powiatwulkanowy/123456/UczenDziennik.mvc/Get" (edited)
schoolId

































GitHub 









getTimetable (edited)





GitHub 






additionals
































tough-cookie i axios-cookiejar-support


biezacyRokSzkolny




idBiezacyDziennikPrzedszkole

idBiezacyDziennikWychowankowie



























GitHub 


GitHub 



GitHub 







































GitHub 



GitHub 





idBiezacyDziennik, idBiezacyUczen, biezacyRokSzkolny, idBiezacyDziennikPrzedszkole).
I also realized that using async cookie store methods is unnecessary, as the default store is synchronous. This also allowed to remove the Diary.create method.
GitHub 


Answer: null









Hello as expected
ts
import cheerio from 'cheerio';
const $: cheerio.Root = cheerio.load('<div>Hello</div>');
console.log($('div').text());
ts
import cheerio, { Root } from 'cheerio';
const $: Root = cheerio.load('<div>Hello</div>');
console.log($('div').text());
```ts
import type { Root
(...)
GitHub 
getCredentials











dist było jakieś stare kiedy ostatni raz dałem npm run build



GitHub 




UczenDziennik.mvc/GetUnknownSymbolError




Hello as expected
ts
import cheerio from 'cheerio';
const $: cheerio.Root = cheerio.load('<div>Hello</div>');
console.log($('div').text());
ts
import cheerio, { Root } from 'cheerio';
const $: Root = cheerio.load('<div>Hello</div>');
console.log($('div').text());
```ts
import type { Root
(...)
GitHub 




GitHub 



ale ciekawe jest to że jest na podstawie vulcan api który używany jest w szkolnym eu

GitHub 

























@wulkanowy/sdk



















?

GitHub 












npm i @wulkanowy/sdk. There are no other projects in the npm registry using @wulkanowy/sdk.









const credentials = {
username: 'username',
password: 'password'
}
const client = new Client('vulcan.net.pl', () => credentials)
client.login() (edited)



























new Client() to jakiego urla tam dać

await vulcan.setSymbol("gorlice");





GitHub 




vulcan-api-js




















