@@ -375,8 +375,11 @@ module.exports = {
375375
376376 if ( data . error ) throw new Error ( data . error ) ;
377377
378- const cookie = cookies . find ( ( c ) => c . includes ( 'sessionid=' ) ) ;
379- const session = ( cookie . match ( / s e s s i o n i d = ( .* ?) ; / ) ?? [ ] ) [ 1 ] ;
378+ const sessionCookie = cookies . find ( ( c ) => c . includes ( 'sessionid=' ) ) ;
379+ const session = ( sessionCookie . match ( / s e s s i o n i d = ( .* ?) ; / ) ?? [ ] ) [ 1 ] ;
380+
381+ const signCookie = cookies . find ( ( c ) => c . includes ( 'sessionid_sign=' ) ) ;
382+ const signature = ( signCookie . match ( / s e s s i o n i d _ s i g n = ( .* ?) ; / ) ?? [ ] ) [ 1 ] ;
380383
381384 return {
382385 id : data . user . id ,
@@ -388,6 +391,7 @@ module.exports = {
388391 followers : data . user . followers ,
389392 notifications : data . user . notification_count ,
390393 session,
394+ signature,
391395 sessionHash : data . user . session_hash ,
392396 privateChannel : data . user . private_channel ,
393397 authToken : data . user . auth_token ,
@@ -399,19 +403,20 @@ module.exports = {
399403 * Get user from 'sessionid' cookie
400404 * @function getUser
401405 * @param {string } session User 'sessionid' cookie
406+ * @param {string } [signature] User 'sessionid_sign' cookie
402407 * @param {string } [location] Auth page location (For france: https://fr.tradingview.com/)
403408 * @returns {Promise<User> } Token
404409 */
405- async getUser ( session , location = 'https://www.tradingview.com/' ) {
410+ async getUser ( session , signature = '' , location = 'https://www.tradingview.com/' ) {
406411 return new Promise ( ( cb , err ) => {
407412 https . get ( location , {
408- headers : { cookie : `sessionid=${ session } ` } ,
413+ headers : { cookie : `sessionid=${ session } ${ signature ? `;sessionid_sign= ${ signature } ;` : '' } ` } ,
409414 } , ( res ) => {
410415 let rs = '' ;
411416 res . on ( 'data' , ( d ) => { rs += d ; } ) ;
412417 res . on ( 'end' , async ( ) => {
413418 if ( res . headers . location && location !== res . headers . location ) {
414- cb ( await module . exports . getUser ( session , res . headers . location ) ) ;
419+ cb ( await module . exports . getUser ( session , signature , res . headers . location ) ) ;
415420 return ;
416421 }
417422 if ( rs . includes ( 'auth_token' ) ) {
@@ -428,12 +433,13 @@ module.exports = {
428433 user : parseFloat ( / " n o t i f i c a t i o n _ c o u n t " : \{ " f o l l o w i n g " : [ 0 - 9 ] * , " u s e r " : ( [ 0 - 9 ] * ) / . exec ( rs ) [ 1 ] || 0 ) ,
429434 } ,
430435 session,
436+ signature,
431437 sessionHash : / " s e s s i o n _ h a s h " : " ( .* ?) " / . exec ( rs ) [ 1 ] ,
432438 privateChannel : / " p r i v a t e _ c h a n n e l " : " ( .* ?) " / . exec ( rs ) [ 1 ] ,
433439 authToken : / " a u t h _ t o k e n " : " ( .* ?) " / . exec ( rs ) [ 1 ] ,
434440 joinDate : new Date ( / " d a t e _ j o i n e d " : " ( .* ?) " / . exec ( rs ) [ 1 ] || 0 ) ,
435441 } ) ;
436- } else err ( new Error ( 'Wrong or expired sessionid' ) ) ;
442+ } else err ( new Error ( 'Wrong or expired sessionid/signature ' ) ) ;
437443 } ) ;
438444
439445 res . on ( 'error' , err ) ;
@@ -445,12 +451,13 @@ module.exports = {
445451 * Get user's private indicators from a 'sessionid' cookie
446452 * @function getPrivateIndicators
447453 * @param {string } session User 'sessionid' cookie
454+ * @param {string } [signature] User 'sessionid_sign' cookie
448455 * @returns {Promise<SearchIndicatorResult[]> } Search results
449456 */
450- async getPrivateIndicators ( session ) {
457+ async getPrivateIndicators ( session , signature = '' ) {
451458 return new Promise ( ( cb , err ) => {
452459 https . get ( 'https://pine-facade.tradingview.com/pine-facade/list?filter=saved' , {
453- headers : { cookie : `sessionid=${ session } ` } ,
460+ headers : { cookie : `sessionid=${ session } ${ signature ? `;sessionid_sign= ${ signature } ;` : '' } ` } ,
454461 } , ( res ) => {
455462 let rs = '' ;
456463 res . on ( 'data' , ( d ) => { rs += d ; } ) ;
@@ -499,18 +506,19 @@ module.exports = {
499506 * Get a chart token from a layout ID and the user credentials if the layout is not public
500507 * @function getChartToken
501508 * @param {string } layout The layout ID found in the layout URL (Like: 'XXXXXXXX')
502- * @param {UserCredentials } [credentials] User credentials (id + session)
509+ * @param {UserCredentials } [credentials] User credentials (id + session + [signature] )
503510 * @returns {Promise<string> } Token
504511 */
505512 async getChartToken ( layout , credentials = { } ) {
506513 const creds = credentials . id && credentials . session ;
507514 const userID = creds ? credentials . id : - 1 ;
508515 const session = creds ? credentials . session : null ;
516+ const signature = creds ? credentials . signature : null ;
509517
510518 const { data } = await request ( {
511519 host : 'www.tradingview.com' ,
512520 path : `/chart-token/?image_url=${ layout } &user_id=${ userID } ` ,
513- headers : { cookie : session ? `sessionid=${ session } ` : '' } ,
521+ headers : { cookie : session ? `sessionid=${ session } ${ signature ? `;sessionid_sign= ${ signature } ;` : '' } ` : '' } ,
514522 } ) ;
515523
516524 if ( ! data . token ) throw new Error ( 'Wrong layout or credentials' ) ;
@@ -545,20 +553,21 @@ module.exports = {
545553 * @function getDrawings
546554 * @param {string } layout The layout ID found in the layout URL (Like: 'XXXXXXXX')
547555 * @param {string | '' } [symbol] Market filter (Like: 'BINANCE:BTCEUR')
548- * @param {UserCredentials } [credentials] User credentials (id + session)
556+ * @param {UserCredentials } [credentials] User credentials (id + session + [signature] )
549557 * @param {number } [chartID] Chart ID
550558 * @returns {Promise<Drawing[]> } Drawings
551559 */
552560 async getDrawings ( layout , symbol = '' , credentials = { } , chartID = 1 ) {
553561 const chartToken = await module . exports . getChartToken ( layout , credentials ) ;
554562 const creds = credentials . id && credentials . session ;
555563 const session = creds ? credentials . session : null ;
564+ const signature = creds ? credentials . signature : null ;
556565
557566 const { data } = await request ( {
558567 host : 'charts-storage.tradingview.com' ,
559568 path : `/charts-storage/layout/${ layout } /sources?chart_id=${ chartID
560569 } &jwt=${ chartToken } ${ symbol ? `&symbol=${ symbol } ` : '' } `,
561- headers : { cookie : session ? `sessionid=${ session } ` : '' } ,
570+ headers : { cookie : session ? `sessionid=${ session } ${ signature ? `;sessionid_sign= ${ signature } ;` : '' } ` : '' } ,
562571 } ) ;
563572
564573 if ( ! data . payload ) throw new Error ( 'Wrong layout, user credentials, or chart id.' ) ;
0 commit comments