---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://yandex.com/dev/games/doc/en/sdk/sdk-player.md
  - https://yandex.com/dev/games/doc/hi/sdk/sdk-player.md
  - https://yandex.com/dev/games/doc/ko/sdk/sdk-player.md
  - https://yandex.com/dev/games/doc/ru/sdk/sdk-player.md
  - https://yandex.com/dev/games/doc/tr/sdk/sdk-player.md
  - https://yandex.com/dev/games/doc/vi/sdk/sdk-player.md
  - https://yandex.com/dev/games/doc/zh/sdk/sdk-player.md
  - href: hi/sdk/sdk-player.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.com/dev/games/doc/hi/llms.txt

# खिलाड़ी डेटा

आप गेम स्थिति डेटा (पूरे किए गए लेवल, अनुभव, और इन-गेम खरीदारियों सहित) को Yandex सर्वर पर सेव कर सकते हैं या उसे आपके सर्वर पर स्थानांतरित कर सकते हैं। आप उपयोगकर्ता की Yandex प्रोफ़ाइल के डेटा, जैसे उनके नाम का उपयोग करके गेम को वैयक्तीकृत भी कर सकते हैं।

`Player` ऑब्जेक्ट का उपयोग उपयोगकर्ता डेटा के साथ काम करने के लिए किया जाता है।



## आरंभ करना {#getplayer}

किसी `Player` ऑब्जेक्ट को आरंभ करने के लिए, `ysdk.getPlayer()` विधि का उपयोग करें:

```javascript
var player;

ysdk.getPlayer().then(_player => {
        player = _player;
    }).catch(err => {
        // प्लेयर ऑब्जेक्ट आरंभ करने में त्रुटि।
    });
```

`Player` ऑब्जेक्ट को इनिशियलाइज़ करते समय निम्नलिखित डेटा पास किया जाता है:

- यूज़र आईडी — सभी के लिए।
- अवतार और नाम — ऑथेंटिकेटेड खिलाड़ियों के लिए।
- प्लेटफ़ॉर्म पर खरीदारी से संबंधित डेटा (केवल [इन-ऐप खरीदारी](https://yandex.com/dev/games/doc/hi/console/purchases.md) वाले गेम्स के लिए) — रूस से खिलाड़ियों के लिए।

यूज़र डेटा तक पहुंच उनके [प्रोफ़ाइल](https://yandex.com/games/user) में सेटिंग्स पर निर्भर करती है। अगर खिलाड़ी ने पर्सनल डेटा तक पहुंच प्रतिबंधित कर दी है, तो जवाब में केवल आईडी ही शामिल होगी।

आप उपयोगकर्ता में लॉग इन करने और अपने सर्वर पर गेम स्थिति डेटा को सेव करने के लिए वैकल्पिक `signed: true` पैरामीटर और `fetch` विधि का उपयोग कर सकते हैं। इससे आप प्लेयर को प्रमाणीकृत करने के लिए हस्ताक्षर का उपयोग कर सकते हैं और संभावित धोखाधड़ी से बच सकते हैं।

```javascript
var player;

ysdk.getPlayer({ signed: true }).then(_player => {
        player = _player;

        // अपने सर्वर पर प्राधिकरण के लिए player.signature का उपयोग करें।
        fetch('https://your.game.server?auth', {
            method: 'POST',
            headers: { 'Content-Type': 'text/plain' },
            body: player.signature
        });
    }).catch(err => {
        // प्लेयर ऑब्जेक्ट आरंभ करने में त्रुटि।
    });
```

सर्वर को भेजे गए अनुरोध में `signature` पैरामीटर में उपयोगकर्ता की Yandex प्रोफ़ाइल और हस्ताक्षर का उनका डेटा होता है। इसमें दो Base64-एन्कोडेड स्ट्रिंग शामिल होती हैं:

```text
<signature>.<profile data>
```

अधिक जानकारी के लिए, [धोखाधड़ी की रोकथाम](https://yandex.com/dev/games/doc/hi/sdk/sdk-purchases.md#signature) देखें।

{% note info "नोट" %}

अनुरोध को 5 मिनट में 20 बार से अधिक नहीं भेजा जा सकता, अन्यथा यह एक त्रुटि के साथ अस्वीकृत कर दिया जाएगा।

{% endnote %}



## उपयोगकर्ता लॉगिन {#auth}

### जाँच करना कि कोई उपयोगकर्ता लॉग इन किया हुआ है कि नहीं {#auth-check}

यह जांचने के लिए कि क्या खिलाड़ी यांडेक्स पर लॉग इन है, `Player` ऑब्जेक्ट के मेथड `player.isAuthorized()` का उपयोग करें। यह मेथड `true | false` रिटर्न करता है।

{% note alert "प्रतिबंध" %}

मेथड `player.getMode(): 'lite' | ''` अब पुराना हो चुका है और भविष्य में इंटरफ़ेस से हटा दिया जाएगा।

{% endnote %}


### लॉगिन डायलॉग बॉक्स का आग्रह करना {#open-auth-dialog}

यदि प्लेयर लॉग इन नहीं है, तो आप लॉगिन डायलॉग बॉक्स को खोलने के लिए `ysdk.auth.openAuthDialog()` विधि का उपयोग कर सकते हैं।


{% note tip "सुझाव" %}

उपयोगकर्ता को लॉग इन करने के फायदों के बारे में सूचना दें। जो उपयोगकर्ता फायदे नहीं जानते उनके द्वारा लॉग इन करने से बचने और गेम से निकल जाने की संभावना सबसे ज़्यादा होती है।

{% endnote %}

```javascript
var player;

function initPlayer() {
    return ysdk.getPlayer().then(_player => {
            player = _player;

            return player;
        });
}

initPlayer().then(_player => {
        if (_player.isAuthorized() === false) {
            // प्लेयर लॉग इन नहीं है।
            ysdk.auth.openAuthDialog().then(() => {
                    // प्लेयर लॉग इन है
                    initPlayer().catch(err => {
                        // प्लेयर ऑब्जेक्ट आरंभ करने में त्रुटि।
                    });
                }).catch(() => {
                    // प्लेयर लॉग इन नहीं है।
                });
        }
    }).catch(err => {
        // प्लेयर ऑब्जेक्ट आरंभ करने में त्रुटि।
    });

```



## इन-गेम डेटा {#ingame-data}

उपयोगकर्ता के इन-गेम डेटा के साथ काम करने के लिए, `Player` ऑब्जेक्ट विधि का उपयोग करें:


* `player.setData(data, flush)`: उपयोगकर्ता डेटा को सेव करता है। अधिकतम डेटा आकार 200 KB से अधिक नहीं होना चाहिए। {#setdata}

   - `data`: ऑब्जेक्ट, एक ऑब्जेक्ट जिसमें कुंजी-मान जोड़ियाँ हैं।
   - `flush`: बूलियन, भेजे जाने वाले डेटा का क्रम तय करता है। यदि मान "सही" है, तो डेटा तुरंत सर्वर पर भेज दिया जाता है। यदि वह "गलत" (डिफ़ॉल्ट) है, तो डेटा भेजने के अनुरोध को कतारबद्ध कर दिया जाता है।

   विधि `Promise` दिखाती है जो दर्शाती है कि डेटा सेव किया गया था या नहीं।

   जब पैरामीटर मान `flush: false` होता है, तो परिणाम केवल डेटा वैधता दिखाता है (जबकि डेटा बाद में भेजे जाने के लिए कतारबद्ध है)। हालांकि, यदि आप `player.getData()` का उपयोग अभी करते हैं, तो वह `player.setData()` द्वारा सेट किया गया नवीनतम डेटा दिखाएगा, भले ही वर्तमान डेटा अभी तक भेजा न गया हो।

   ```javascript
   player.setData({
           achievements: ['trophy1', 'trophy2', 'trophy3'],
       }).then(() => {
           console.log('data is set');
       });

   ```


- `player.getData(keys)`: Yandex डेटाबेस में संग्रहित इन-गेम उपयोगकर्ता डेटा एसिंक्रोनस रूप से दिखाता है। {#getdata}

   - `keys`: श्रेणी<string>, दिखाई जाने वाली कुंजी की सूची। यदि `keys` पैरामीटर गायब है, तो विधि सारा इन-गेम डेटा दिखाती है।

   विधि कुंजी-मान जोड़ी वाले ऑब्जेक्ट के साथ `Promise<Object>` लौटाती है।

- `player.setStats(stats)`: उपयोगकर्ता का अंकीय डेटा सेव करता है। अधिकतम डेटा आकार 10 KB से अधिक नहीं होना चाहिए। {#setstats}

   - `stats`: ऑब्जेक्ट, एक ऑब्जेक्ट जिसमें कुंजी-मान जोड़ियाँ हैं जहाँ प्रत्येक मान एक संख्या है।

   विधि `Promise` दिखाती है जो दर्शाती है कि डेटा सेव किया गया था या नहीं।


   {% note tip "सुझाव" %}

   अंकीय मान के लिए जो बार-बार बदलते हैं (जैसे पॉइंट, अनुभव पॉइंट, और इन-गेम मुद्रा) के लिए, [player.setData()](#ingame-data) के बजाय इस विधि का उपयोग करें।

   {% endnote %}



- `player.incrementStats(increments)`: इन-गेम उपयोगकर्ता डेटा में बदलाव। अधिकतम डेटा आकार 10 KB से अधिक नहीं होना चाहिए। {#incrementstats}

   - `increments`: ऑब्जेक्ट, एक ऑब्जेक्ट जिसमें कुंजी-मान जोड़ियाँ हैं जहाँ प्रत्येक मान एक संख्या है।

   विधि बदले हुए और जोड़े गए कुंजी-मान जोड़े वाले ऑब्जेक्ट के साथ `Promise<Object>` लौटाती है।


- `player.getStats(keys)`: उपयोगकर्ता के अंकीय डेटा को एसिंक्रोनिक रूप से दिखाती है। {#getstats}

   - `keys`: श्रेणी<string>, दिखाई जाने वाली कुंजी की सूची। यदि `keys` पैरामीटर गायब है, तो विधि सारा इन-गेम डेटा दिखाती है।

   विधि कुंजी-मान जोड़ी वाले ऑब्जेक्ट के साथ `Promise<Object>` लौटाती है।

{% note info "नोट" %}

अनुरोध भेजने की आवृत्ति सीमित है। यदि [सीमाओं](#limits) को पार किया जाता है, तो अनुरोधों को त्रुटि के साथ अस्वीकार कर दिया जाएगा।

{% endnote %}



## उपयोगकर्ता प्रोफ़ाइल डेटा {#profile-data}

Yandex उपयोगकर्ता प्रोफ़ाइल का डेटा पाने के लिए, `Player` ऑब्जेक्ट विधियों का उपयोग करें:

- `player.getUniqueID()`: उपयोगकर्ता का अनन्य स्थायी ID (प्रकार: स्ट्रिंग) दिखाता है।

   {% note info "नोट" %}

   पहले उपयोग की जाने वाली `player.getID()` विधि अब अप्रचलित है, लेकिन वह त्रुटि कंसोल में चेतावनी देते हुए कुछ समय तक काम करना जारी रखेगी।

   `player.getID()` और `player.getUniqueID()` के मान आम तौर पर किसी दिए गए `Player` ऑब्जेक्ट के लिए समान नहीं होते हैं, लेकिन वे कुछ उपयोगकर्ताओं के लिए समान हो सकते हैं। यदि मान भिन्न हैं और गेम ने पहले से ही कुछ डेटा को `player.getID()` मान से लिंक कर दिया है, तो आपको इस डेटा को माइग्रेट करने की और उसे `player.getUniqueID()` के मान से लिंक करने की आवश्यकता है। सभी उपयोगकर्ताओं के लिए एक साथ डेटा को माइग्रेट करने के लिए, कृपया [सहायता से संपर्क करें](https://yandex.com/dev/games/doc/hi/concepts/troubleshooting.md#fos)।

   {% endnote %}

- `player.getIDsPerGame()`: `Promise<Array>` लौटाता है, जहाँ उपयोगकर्ता ID को उन सभी डेवलपर गेम में निर्दिष्ट किया जाता है जिनमें उपयोगकर्ता ने अपने व्यक्तिगत डेटा के हस्तांतरण के लिए स्पष्ट रूप से सहमति दी है। उदाहरण के लिए:

   ```javascript
   [
       { appID: 103915, userID: "tOpLpSh7i8QG8Voh/SuPbeS4NKTj1OxATCTKQF92H4c=" },
       { appID: 103993, userID: "bviQCIAAuVmNMP66bZzC4x+4oSFzRKpteZ/euP/Jwv4=" }
   ]
   ```

   {% note alert "चेतावनी" %}

   अनुरोध केवल लॉग-इन किए हुए उपयोगकर्ताओं के लिए उपलब्ध है। यदि आवश्यक हो, तो [प्राधिकरण](#auth) का उपयोग करें।

   उपयोगकर्ता के लिए विधि उपलब्ध है कि नहीं इसकी जाँच करने के लिए, आप `ysdk.isAvailableMethod('player.getIDsPerGame')` विधि का उपयोग कर सकते हैं। वह `Promise<Boolean>`, लौटाता है, जहाँ बूलियन मान यह संकेत करता है कि विधि उपलब्ध है या नहीं।

   {% endnote %}

- `player.getName()`: उपयोगकर्ता का नाम (प्रकार: स्ट्रिंग) दिखाता है।


- `player.getPhoto(size)`: उपयोगकर्ता के अवतार का URL (प्रकार: स्ट्रिंग) लौटाता है।

   - `size`: स्ट्रिंग, आवश्यक आकार। संभावित मान: `small`, `medium`, `large`।



## मेथड्स की सीमाएं {#limits}

#|
|| **विधि** | **विवरण** | **प्रतिबंध** ||
|| `ysdk.getPlayer()` | [`Player` ऑब्जेक्ट को आरंभ करता है](#getplayer) |::{align="center"} 5 मिनट में 20 अनुरोध। ||
|| `player.setData()` | [उपयोगकर्ता का डेटा संग्रहित करता है](#setdata) |::{align="center"} 5 मिनट में 100 अनुरोध। ||
|| `player.getData()` | [उपयोगकर्ता के इन-गेम डेटा को असिंक्रोनस रूप से लौटाता है](#getdata) | ^ ||
|| `player.setStats()` | [उपयोगकर्ता के संख्यात्मक डेटा को सहेजता है](#setstats) |::{align="center"} 1 मिनट में 60 अनुरोध। ||
|| `player.getStats()` | [उपयोगकर्ता के अंकीय डेटा को एसिंक्रोनिक रूप से दिखाती है।](#getstats) | ^ ||
|| `player.incrementStats()` | [उपयोगकर्ता के इन-गेम डेटा को बदलता है](#incrementstats) | ^ ||
|#



## iOS पर प्रगति की हानि {#progress-loss}

यदि गेम को `iframe` के जरिए इंटीग्रेट किया गया है, तो `localStorage` अक्सर नए iOS संस्करणों पर रीसेट हो सकता है, जिससे खिलाड़ी अपनी प्रगति खो सकते हैं। इससे बचने के लिए, `safeStorage` का उपयोग करें, जिसका इंटरफ़ेस `localStorage` के समान है:

```javascript
ysdk.getStorage().then(safeStorage => {
        safeStorage.setItem('key', 'safe storage is working');
        console.log(safeStorage.getItem('key'))
    })
```

कोड को मैन्युअल रूप से बदलने से बचने के लिए, वैश्विक स्तर पर `localStorage` को ओवरराइड करें।


{% note alert "चेतावनी" %}

इसे ओवरराइड करने से पहले सुनिश्चित करें कि `localStorage` का उपयोग नहीं किया गया है।

{% endnote %}


```javascript
ysdk.getStorage().then(safeStorage => Object.defineProperty(window, 'localStorage', { get: () => safeStorage }))
    .then(() => {
        localStorage.setItem('key', 'safe storage is working');
        console.log(localStorage.getItem('key'))
    })
```

यदि आप सोर्स कोड को एक आर्काइव के रूप में डाउनलोड करते हैं, तो कुछ भी करने की आवश्यकता नहीं है: SDK में एक विशेष रैपर स्वचालित रूप से `localStorage` को विश्वसनीय बनाता है।


---

<!-- source: hi/_includes/concepts/troubleshooting/id-troubleshooting/support.md -->
{% note info "नोट" %}

टीम सपोर्ट के कर्मचारी यंडेक्स गेम्स प्लेटफॉर्म पर तैयार खेल को डालने में मदद करते हैं। डेवलपमेंट और परीक्षण के संबंध में आवेदनिक प्रश्नों का उत्तर अन्य डेवलपर्स देंगे [Discord चैनल](https://discord.com/invite/wU4p3whr4T)।

{% endnote %}
<!-- endsource: hi/_includes/concepts/troubleshooting/id-troubleshooting/support.md -->

<!-- source: hi/_includes/button-fos.md -->
यदि आप किसी समस्या का सामना कर रहे हैं या Yandex Games SDK के इस्तेमाल के बारे में आपका कोई प्रश्न है, तो कृपया समर्थन से संपर्क करें:


<a href="https://yandex.com/chat/#/user/a4fa5c06-75db-9b38-6eea-b1673785f7d5">
  <span class="button">चैट करने के लिए लिखें</span>
</a>
<!-- endsource: hi/_includes/button-fos.md -->
