API ద్వారా PowerShell నుండి Google వినియోగదారులను సృష్టిస్తోంది

వందనాలు!

G Suite వినియోగదారులను మార్చేందుకు Google APIతో PowerShell పరస్పర చర్య అమలును ఈ కథనం వివరిస్తుంది.

మేము సంస్థ అంతటా అనేక అంతర్గత మరియు క్లౌడ్ సేవలను ఉపయోగిస్తాము. చాలా వరకు, వాటిలో అధికారం Google లేదా యాక్టివ్ డైరెక్టరీకి వస్తుంది, దీని మధ్య మేము ప్రతిరూపాన్ని నిర్వహించలేము; తదనుగుణంగా, కొత్త ఉద్యోగి నిష్క్రమించినప్పుడు, మీరు ఈ రెండు సిస్టమ్‌లలో ఖాతాను సృష్టించాలి/ప్రారంభించాలి. ప్రక్రియను ఆటోమేట్ చేయడానికి, మేము సమాచారాన్ని సేకరించి రెండు సేవలకు పంపే స్క్రిప్ట్‌ను వ్రాయాలని నిర్ణయించుకున్నాము.

అధికార

అవసరాలను రూపొందించేటప్పుడు, అధికారం కోసం నిజమైన మానవ నిర్వాహకులను ఉపయోగించాలని మేము నిర్ణయించుకున్నాము; ఇది ప్రమాదవశాత్తూ లేదా ఉద్దేశపూర్వకంగా భారీ మార్పుల సందర్భంలో చర్యల విశ్లేషణను సులభతరం చేస్తుంది.

Google APIలు ప్రామాణీకరణ మరియు ప్రమాణీకరణ కోసం OAuth 2.0 ప్రోటోకాల్‌ను ఉపయోగిస్తాయి. వినియోగ సందర్భాలు మరియు మరింత వివరణాత్మక వివరణలు ఇక్కడ చూడవచ్చు: Google APIలను యాక్సెస్ చేయడానికి OAuth 2.0ని ఉపయోగించడం.

నేను డెస్క్‌టాప్ అప్లికేషన్‌లలో ఆథరైజేషన్ కోసం ఉపయోగించే స్క్రిప్ట్‌ని ఎంచుకున్నాను. సేవ ఖాతాను ఉపయోగించడానికి ఒక ఎంపిక కూడా ఉంది, ఇది వినియోగదారు నుండి అనవసరమైన కదలికలు అవసరం లేదు.

దిగువన ఉన్న చిత్రం Google పేజీ నుండి ఎంచుకున్న దృశ్యం యొక్క స్కీమాటిక్ వివరణ.

API ద్వారా PowerShell నుండి Google వినియోగదారులను సృష్టిస్తోంది

  1. ముందుగా, మేము GET పారామితులను పేర్కొంటూ వినియోగదారుని Google ఖాతా ప్రమాణీకరణ పేజీకి పంపుతాము:
    • అప్లికేషన్ id
    • అప్లికేషన్ యాక్సెస్ అవసరమైన ప్రాంతాలు
    • విధానాన్ని పూర్తి చేసిన తర్వాత వినియోగదారు దారి మళ్లించబడే చిరునామా
    • మేము టోకెన్‌ను అప్‌డేట్ చేసే విధానం
    • భద్రతా సంఖ్య
    • ధృవీకరణ కోడ్ ట్రాన్స్మిషన్ ఫార్మాట్

  2. ప్రామాణీకరణ పూర్తయిన తర్వాత, వినియోగదారు మొదటి అభ్యర్థనలో పేర్కొన్న పేజీకి దారి మళ్లించబడతారు, GET పారామితుల ద్వారా ఆమోదించబడిన లోపం లేదా అధికార కోడ్‌తో
  3. అప్లికేషన్ (స్క్రిప్ట్) ఈ పారామితులను స్వీకరించాలి మరియు కోడ్‌ని స్వీకరించినట్లయితే, టోకెన్‌లను పొందేందుకు క్రింది అభ్యర్థనను చేయండి
  4. అభ్యర్థన సరైనదైతే, Google API అందిస్తుంది:
    • మేము అభ్యర్థనలు చేయగల యాక్సెస్ టోకెన్
    • ఈ టోకెన్ యొక్క చెల్లుబాటు వ్యవధి
    • యాక్సెస్ టోకెన్‌ను రిఫ్రెష్ చేయడానికి రిఫ్రెష్ టోకెన్ అవసరం.

ముందుగా మీరు Google API కన్సోల్‌కి వెళ్లాలి: ఆధారాలు - Google API కన్సోల్, కావలసిన అప్లికేషన్‌ను ఎంచుకోండి మరియు క్రెడెన్షియల్స్ విభాగంలో క్లయింట్ OAuth ఐడెంటిఫైయర్‌ను సృష్టించండి. అక్కడ (లేదా తరువాత, సృష్టించిన ఐడెంటిఫైయర్ యొక్క లక్షణాలలో) మీరు దారి మళ్లింపు అనుమతించబడే చిరునామాలను పేర్కొనాలి. మా విషయంలో, ఇవి వేర్వేరు పోర్ట్‌లతో అనేక లోకల్ హోస్ట్ ఎంట్రీలుగా ఉంటాయి (క్రింద చూడండి).

స్క్రిప్ట్ అల్గోరిథం చదవడం మరింత సౌకర్యవంతంగా చేయడానికి, మీరు అప్లికేషన్ కోసం యాక్సెస్ మరియు రిఫ్రెష్ టోకెన్‌లను తిరిగి ఇచ్చే ప్రత్యేక ఫంక్షన్‌లో మొదటి దశలను ప్రదర్శించవచ్చు:

$client_secret = 'Our Client Secret'
$client_id = 'Our Client ID'
function Get-GoogleAuthToken {
  if (-not [System.Net.HttpListener]::IsSupported) {
    "HttpListener is not supported."
    exit 1
  }
  $codeverifier = -join ((65..90) + (97..122) + (48..57) + 45 + 46 + 95 + 126 |Get-Random -Count 60| % {[char]$_})
  $hasher = new-object System.Security.Cryptography.SHA256Managed
  $hashByteArray = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($codeverifier))
  $base64 = ((([System.Convert]::ToBase64String($hashByteArray)).replace('=','')).replace('+','-')).replace('/','_')
  $ports = @(10600,15084,39700,42847,65387,32079)
  $port = $ports[(get-random -Minimum 0 -maximum 5)]
  Write-Host "Start browser..."
  Start-Process "https://accounts.google.com/o/oauth2/v2/auth?code_challenge_method=S256&code_challenge=$base64&access_type=offline&client_id=$client_id&redirect_uri=http://localhost:$port&response_type=code&scope=https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.group"
  $listener = New-Object System.Net.HttpListener
  $listener.Prefixes.Add("http://localhost:"+$port+'/')
  try {$listener.Start()} catch {
    "Unable to start listener."
    exit 1
  }
  while (($code -eq $null)) {
    $context = $listener.GetContext()
    Write-Host "Connection accepted" -f 'mag'
    $url = $context.Request.RawUrl
    $code = $url.split('?')[1].split('=')[1].split('&')[0]
    if ($url.split('?')[1].split('=')[0] -eq 'error') {
      Write-Host "Error!"$code -f 'red'
      $buffer = [System.Text.Encoding]::UTF8.GetBytes("Error!"+$code)
      $context.Response.ContentLength64 = $buffer.Length
      $context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
      $context.Response.OutputStream.Close()
      $listener.Stop()
      exit 1
    }
    $buffer = [System.Text.Encoding]::UTF8.GetBytes("Now you can close this browser tab.")
    $context.Response.ContentLength64 = $buffer.Length
    $context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
    $context.Response.OutputStream.Close()
    $listener.Stop()
  }
  Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -Body @{
    code = $code
    client_id = $client_id
    client_secret = $client_secret
    redirect_uri = 'http://localhost:'+$port
    grant_type = 'authorization_code'
    code_verifier   = $codeverifier
  }
  $code = $null

మేము OAuth క్లయింట్ ఐడెంటిఫైయర్ ప్రాపర్టీస్‌లో పొందిన క్లయింట్ ID మరియు క్లయింట్ రహస్యాన్ని సెట్ చేసాము మరియు కోడ్ వెరిఫైయర్ అనేది 43 నుండి 128 అక్షరాల స్ట్రింగ్, ఇది తప్పనిసరిగా రిజర్వ్ చేయని అక్షరాల నుండి యాదృచ్ఛికంగా ఉత్పత్తి చేయబడుతుంది: [AZ] / [az] / [0-9 ] / "-" / "." / "_" / "~".

ఈ కోడ్ మళ్లీ ప్రసారం చేయబడుతుంది. వినియోగదారు అధికారం తర్వాత దారి మళ్లింపుగా తిరిగి వచ్చిన ప్రతిస్పందనను దాడి చేసే వ్యక్తి అడ్డగించే దుర్బలత్వాన్ని ఇది తొలగిస్తుంది.
మీరు ప్రస్తుత అభ్యర్థనలో స్పష్టమైన టెక్స్ట్‌లో కోడ్ వెరిఫైయర్‌ను పంపవచ్చు (దీనిని అర్థరహితం చేస్తుంది - ఇది SHA256కి మద్దతు ఇవ్వని సిస్టమ్‌లకు మాత్రమే అనుకూలంగా ఉంటుంది), లేదా SHA256 అల్గారిథమ్‌ని ఉపయోగించి హాష్‌ని సృష్టించడం ద్వారా, ఇది తప్పనిసరిగా BASE64Urlలో ఎన్‌కోడ్ చేయబడాలి (భిన్నమైనది Base64 నుండి రెండు టేబుల్ క్యారెక్టర్‌ల ద్వారా) మరియు క్యారెక్టర్ లైన్ ఎండింగ్‌లను తీసివేయడం: =.

తర్వాత, అధికారీకరణ తర్వాత ప్రతిస్పందనను స్వీకరించడానికి మేము స్థానిక మెషీన్‌లో http వినడం ప్రారంభించాలి, అది దారి మళ్లింపుగా అందించబడుతుంది.

అడ్మినిస్ట్రేటివ్ టాస్క్‌లు ప్రత్యేక సర్వర్‌లో నిర్వహించబడతాయి, అనేక మంది నిర్వాహకులు ఒకేసారి స్క్రిప్ట్‌ని అమలు చేసే అవకాశాన్ని మేము తోసిపుచ్చలేము, కనుక ఇది యాదృచ్ఛికంగా ప్రస్తుత వినియోగదారు కోసం పోర్ట్‌ను ఎంచుకుంటుంది, కానీ నేను ముందే నిర్వచించిన పోర్ట్‌లను పేర్కొన్నాను అవి తప్పనిసరిగా API కన్సోల్‌లో విశ్వసనీయంగా కూడా జోడించబడాలి.

access_type=ఆఫ్‌లైన్ బ్రౌజర్‌తో యూజర్ ఇంటరాక్షన్ లేకుండానే అప్లికేషన్ గడువు ముగిసిన టోకెన్‌ను స్వయంగా అప్‌డేట్ చేయగలదని అర్థం,
response_type = కోడ్ కోడ్ ఎలా తిరిగి ఇవ్వబడుతుందనే ఆకృతిని సెట్ చేస్తుంది (పాత అధికార పద్ధతికి సూచన, బ్రౌజర్ నుండి కోడ్‌ను స్క్రిప్ట్‌లోకి వినియోగదారు కాపీ చేసినప్పుడు),
పరిధిని యాక్సెస్ యొక్క పరిధి మరియు రకాన్ని సూచిస్తుంది. అవి తప్పనిసరిగా ఖాళీలు లేదా %20 (URL ఎన్‌కోడింగ్ ప్రకారం) ద్వారా వేరు చేయబడాలి. రకాలతో యాక్సెస్ ప్రాంతాల జాబితాను ఇక్కడ చూడవచ్చు: Google APIల కోసం OAuth 2.0 స్కోప్‌లు.

అధికార కోడ్‌ను స్వీకరించిన తర్వాత, అప్లికేషన్ బ్రౌజర్‌కి దగ్గరి సందేశాన్ని అందిస్తుంది, పోర్ట్‌లో వినడం ఆపివేస్తుంది మరియు టోకెన్‌ను పొందేందుకు POST అభ్యర్థనను పంపుతుంది. మేము దీనిలో మునుపు పేర్కొన్న id మరియు కన్సోల్ API నుండి రహస్యాన్ని సూచిస్తాము, వినియోగదారు మళ్లించబడే చిరునామా మరియు ప్రోటోకాల్ స్పెసిఫికేషన్‌కు అనుగుణంగా గ్రాంట్_టైప్ చేయండి.

ప్రతిస్పందనగా, మేము యాక్సెస్ టోకెన్‌ను, దాని చెల్లుబాటు వ్యవధిని సెకన్లలో మరియు రిఫ్రెష్ టోకెన్‌ను స్వీకరిస్తాము, దానితో మేము యాక్సెస్ టోకెన్‌ను నవీకరించవచ్చు.

అప్లికేషన్ టోకెన్‌లను సుదీర్ఘ షెల్ఫ్ లైఫ్‌తో సురక్షితమైన స్థలంలో నిల్వ చేయాలి, కాబట్టి మేము అందుకున్న యాక్సెస్‌ను ఉపసంహరించుకునే వరకు, అప్లికేషన్ రిఫ్రెష్ టోకెన్‌ను తిరిగి ఇవ్వదు. ముగింపులో, నేను టోకెన్‌ను ఉపసంహరించుకునే అభ్యర్థనను జోడించాను; అప్లికేషన్ విజయవంతంగా పూర్తి కాకపోతే మరియు రిఫ్రెష్ టోకెన్ తిరిగి ఇవ్వబడకపోతే, అది మళ్లీ విధానాన్ని ప్రారంభిస్తుంది (టెర్మినల్‌లో స్థానికంగా టోకెన్‌లను నిల్వ చేయడం సురక్షితం కాదని మేము భావించాము మరియు మేము చేయను క్రిప్టోగ్రఫీతో విషయాలను క్లిష్టతరం చేయడం లేదా బ్రౌజర్‌ను తరచుగా తెరవడం ఇష్టం లేదు).

do {
  $token_result = Get-GoogleAuthToken
  $token = $token_result.access_token
  if ($token_result.refresh_token -eq $null) {
    Write-Host ("Session is not destroyed. Revoking token...")
    Invoke-WebRequest -Uri ("https://accounts.google.com/o/oauth2/revoke?token="+$token)
  }
} while ($token_result.refresh_token -eq $null)
$refresh_token = $token_result.refresh_token
$minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Minute)-2
if ($minute -lt 0) {$minute += 60}
elseif ($minute -gt 59) {$minute -=60}
$token_expire = @{
  hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Hour)
  minute = $minute
}

మీరు ఇప్పటికే గమనించినట్లుగా, టోకెన్‌ను ఉపసంహరించేటప్పుడు, ఇన్‌వోక్-వెబ్‌రిక్వెస్ట్ ఉపయోగించబడుతుంది. Invoke-RestMethod వలె కాకుండా, ఇది స్వీకరించిన డేటాను ఉపయోగించదగిన ఆకృతిలో తిరిగి ఇవ్వదు మరియు అభ్యర్థన యొక్క స్థితిని చూపుతుంది.

తరువాత, లాగిన్ + ఇమెయిల్‌ను రూపొందించడం ద్వారా వినియోగదారు మొదటి మరియు చివరి పేరును నమోదు చేయమని స్క్రిప్ట్ మిమ్మల్ని అడుగుతుంది.

అభ్యర్థనలు

తదుపరి అభ్యర్థనలు - అన్నింటిలో మొదటిది, క్రొత్తదాన్ని సృష్టించడం లేదా ప్రస్తుత దాన్ని ప్రారంభించడంపై నిర్ణయం తీసుకోవడానికి అదే లాగిన్‌తో వినియోగదారు ఇప్పటికే ఉన్నారో లేదో మీరు తనిఖీ చేయాలి.

నేను స్విచ్ ఉపయోగించి, ఎంపికతో ఒక ఫంక్షన్ ఫార్మాట్‌లో అన్ని అభ్యర్థనలను అమలు చేయాలని నిర్ణయించుకున్నాను:

function GoogleQuery {
  param (
    $type,
    $query
  )
  switch ($type) {
    "SearchAccount" {
      Return Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body @{
        domain = 'rocketguys.com'
        query  = "email:$query"
      }
    }
    "UpdateAccount" {
      $body = @{
        name  = @{
          givenName = $query['givenName']
          familyName = $query['familyName']
        }
        suspended = 'false'
        password = $query['password']
        changePasswordAtNextLogin = 'true'
        phones = @(@{
          primary = 'true'
          value = $query['phone']
          type = "mobile"
        })
        orgUnitPath = $query['orgunit']
      }
      Return Invoke-RestMethod -Method Put -Uri ("https://www.googleapis.com/admin/directory/v1/users/"+$query['email']) -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
    }
    
    "CreateAccount" {
      $body = @{
        primaryEmail = $query['email']
        name  = @{
          givenName = $query['givenName']
          familyName = $query['familyName']
        }
        suspended = 'false'
        password = $query['password']
        changePasswordAtNextLogin = 'true'
        phones = @(@{
          primary = 'true'
          value = $query['phone']
          type = "mobile"
        })
        orgUnitPath = $query['orgunit']
      }
      Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
    }
    "AddMember" {
      $body = @{
        userKey = $query['email']
      }
      $ifrequest = Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/groups" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body $body
      $array = @()
      foreach ($group in $ifrequest.groups) {$array += $group.email}
      if ($array -notcontains $query['groupkey']) {
        $body = @{
          email = $query['email']
          role = "MEMBER"
        }
        Return Invoke-RestMethod -Method Post -Uri ("https://www.googleapis.com/admin/directory/v1/groups/"+$query['groupkey']+"/members") -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
      } else {
        Return ($query['email']+" now is a member of "+$query['groupkey'])
      }
    }
  }
}

ప్రతి అభ్యర్థనలో, మీరు టోకెన్ రకం మరియు యాక్సెస్ టోకెన్‌ను కలిగి ఉన్న ఆథరైజేషన్ హెడర్‌ను పంపాలి. ప్రస్తుతం, టోకెన్ రకం ఎల్లప్పుడూ బేరర్. ఎందుకంటే మేము టోకెన్ గడువు ముగియలేదని తనిఖీ చేయాలి మరియు అది జారీ చేయబడిన క్షణం నుండి ఒక గంట తర్వాత దాన్ని అప్‌డేట్ చేయాలి, యాక్సెస్ టోకెన్‌ను తిరిగి ఇచ్చే మరొక ఫంక్షన్ కోసం నేను అభ్యర్థనను పేర్కొన్నాను. మొదటి యాక్సెస్ టోకెన్‌ను స్వీకరించినప్పుడు అదే కోడ్ ముక్క స్క్రిప్ట్ ప్రారంభంలో ఉంటుంది:

function Get-GoogleToken {
  if (((Get-date).Hour -gt $token_expire.hour) -or (((Get-date).Hour -ge $token_expire.hour) -and ((Get-date).Minute -gt $token_expire.minute))) {
  Write-Host "Token Expired. Refreshing..."
    $request = (Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -ContentType 'application/x-www-form-urlencoded' -Body @{
      client_id = $client_id
      client_secret = $client_secret
      refresh_token = $refresh_token
      grant_type = 'refresh_token'
    })
    $token = $request.access_token
    $minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Minute)-2
    if ($minute -lt 0) {$minute += 60}
    elseif ($minute -gt 59) {$minute -=60}
    $script:token_expire = @{
      hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Hour)
      minute = $minute
    }
  }
  return $token
}

ఉనికి కోసం లాగిన్‌ని తనిఖీ చేస్తోంది:

function Check_Google {
  $query = (GoogleQuery 'SearchAccount' $username)
  if ($query.users -ne $null) {
    $user = $query.users[0]
    Write-Host $user.name.fullName' - '$user.PrimaryEmail' - suspended: '$user.Suspended
    $GAresult = $user
  }
  if ($GAresult) {
      $return = $GAresult
  } else {$return = 'gg'}
  return $return
}

ఇమెయిల్:$query అభ్యర్థన, మారుపేర్లతో సహా ఖచ్చితంగా ఆ ఇమెయిల్‌తో వినియోగదారు కోసం వెతకమని APIని అడుగుతుంది. మీరు వైల్డ్‌కార్డ్‌ని కూడా ఉపయోగించవచ్చు: =, :, :{PREFIX}*.

డేటాను పొందడానికి, GET అభ్యర్థన పద్ధతిని ఉపయోగించండి, డేటాను ఇన్సర్ట్ చేయడానికి (ఖాతాను సృష్టించడం లేదా సమూహానికి సభ్యుడిని జోడించడం) - POST, ఇప్పటికే ఉన్న డేటాను నవీకరించడానికి - PUT, రికార్డ్‌ను తొలగించడానికి (ఉదాహరణకు, సమూహం నుండి సభ్యుడు) - తొలగించు.

స్క్రిప్ట్ ఫోన్ నంబర్ (ఒక చెల్లుబాటు కాని స్ట్రింగ్) మరియు ప్రాంతీయ పంపిణీ సమూహంలో చేర్చడం కోసం కూడా అడుగుతుంది. ఎంచుకున్న యాక్టివ్ డైరెక్టరీ OU ఆధారంగా వినియోగదారు ఏ సంస్థాగత యూనిట్‌ని కలిగి ఉండాలో ఇది నిర్ణయిస్తుంది మరియు పాస్‌వర్డ్‌తో వస్తుంది:

do {
  $phone = Read-Host "Телефон в формате +7хххххххх"
} while (-not $phone)
do {
    $moscow = Read-Host "В Московский офис? (y/n) "
} while (-not (($moscow -eq 'y') -or ($moscow -eq 'n')))
$orgunit = '/'
if ($OU -like "*OU=Delivery,OU=Users,OU=ROOT,DC=rocket,DC=local") {
    Write-host "Будет создана в /Team delivery"
    $orgunit = "/Team delivery"
}
$Password =  -join ( 48..57 + 65..90 + 97..122 | Get-Random -Count 12 | % {[char]$_})+"*Ba"

ఆపై అతను ఖాతాను మార్చడం ప్రారంభిస్తాడు:

$query = @{
  email = $email
  givenName = $firstname
  familyName = $lastname
  password = $password
  phone = $phone
  orgunit = $orgunit
}
if ($GMailExist) {
  Write-Host "Запускаем изменение аккаунта" -f mag
  (GoogleQuery 'UpdateAccount' $query) | fl
  write-host "Не забудь проверить группы у включенного $Username в Google."
} else {
  Write-Host "Запускаем создание аккаунта" -f mag
  (GoogleQuery 'CreateAccount' $query) | fl
}
if ($moscow -eq "y"){
  write-host "Добавляем в группу moscowoffice"
  $query = @{
    groupkey = '[email protected]'
    email = $email
  }
  (GoogleQuery 'AddMember' $query) | fl
}

ఖాతాను నవీకరించడం మరియు సృష్టించడం కోసం విధులు ఒకే విధమైన వాక్యనిర్మాణాన్ని కలిగి ఉంటాయి; అన్ని అదనపు ఫీల్డ్‌లు అవసరం లేదు; ఫోన్ నంబర్‌లతో విభాగంలో, మీరు నంబర్ మరియు దాని రకంతో గరిష్టంగా ఒక రికార్డ్‌ను కలిగి ఉండే శ్రేణిని పేర్కొనాలి.

ఒక సమూహానికి వినియోగదారుని జోడించేటప్పుడు లోపాన్ని అందుకోకుండా ఉండేందుకు, వినియోగదారు నుండి సమూహ సభ్యుల జాబితా లేదా కూర్పును పొందడం ద్వారా అతను ఇప్పటికే ఈ గుంపులో సభ్యుడిగా ఉన్నారా అని మేము ముందుగా తనిఖీ చేయవచ్చు.

నిర్దిష్ట వినియోగదారు యొక్క సమూహ సభ్యత్వాన్ని ప్రశ్నించడం పునరావృతం కాదు మరియు ప్రత్యక్ష సభ్యత్వాన్ని మాత్రమే చూపుతుంది. ఇప్పటికే చైల్డ్ గ్రూప్‌ని కలిగి ఉన్న పేరెంట్ గ్రూప్‌లో యూజర్‌ని చేర్చుకోవడం విజయవంతం అవుతుంది.

తీర్మానం

కొత్త ఖాతా కోసం పాస్‌వర్డ్‌ను వినియోగదారుకు పంపడమే మిగిలి ఉంది. మేము దీన్ని SMS ద్వారా చేస్తాము మరియు సూచనలతో సాధారణ సమాచారాన్ని పంపుతాము మరియు వ్యక్తిగత ఇమెయిల్‌కి లాగిన్ చేయండి, ఫోన్ నంబర్‌తో పాటు రిక్రూట్‌మెంట్ విభాగం అందించింది. ప్రత్యామ్నాయంగా, మీరు డబ్బు ఆదా చేసుకోవచ్చు మరియు మీ పాస్‌వర్డ్‌ను రహస్య టెలిగ్రామ్ చాట్‌కు పంపవచ్చు, ఇది రెండవ అంశంగా కూడా పరిగణించబడుతుంది (మ్యాక్‌బుక్స్ మినహాయింపు అవుతుంది).

చివరి వరకు చదివినందుకు ధన్యవాదాలు. వ్యాసాలు వ్రాసే శైలిని మెరుగుపరచడానికి సూచనలను చూసి నేను సంతోషిస్తాను మరియు స్క్రిప్ట్‌లను వ్రాసేటప్పుడు మీరు తక్కువ తప్పులను పట్టుకోవాలని కోరుకుంటున్నాను =)

ఇతివృత్తంగా ఉపయోగపడే లేదా ప్రశ్నలకు సమాధానమిచ్చే లింక్‌ల జాబితా:

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి